当前位置: 代码迷 >> C语言 >> [讨论]第七次编程题目,大家支持一下
  详细解决方案

[讨论]第七次编程题目,大家支持一下

热度:150   发布时间:2007-03-12 22:50:16.0
看了一下se7en_enter 的算法大体上和我的差不多.但觉得你在求times这段代码中有点冗余.看能不能再简化一下.
----------------解决方案--------------------------------------------------------
回复:(无玩过界)to:zcs302,你的思路很不错[em17],...

谢谢你,我考虑还不够周到
已经改过来了
else if(*(p+i)=='#')
{
if(*(p+i-1)=='\n' && outlen==0)
continue;
else
outlen--;
}//里面的&& 改成|| 就行了


----------------解决方案--------------------------------------------------------
crackerwang I喜欢c 都写的蛮好.

crackerwang 最好不要写递归,效率低.

I喜欢c 说下qu()的思路.
----------------解决方案--------------------------------------------------------
to:zcs302,也有BUG
12345
###########
----------------解决方案--------------------------------------------------------
回复:(crackerwang)
已经注释好,在第3页最后
大概思路就是把3的n次方全部处理成n,n从{2}开始,{2}后的有{20}{21}{210},后抛去10,剩下一个2升到{3},后是{30}{31}{310},抛去10,{32}后是{320}{321}{3210},抛弃210,剩下一个3升到4,后{40}{41}{410},抛去10,{42}{420}{421}{4210},抛去10,{43}{430}{431}{4310},抛去10,{432}{4320}{4321}{43210},抛去3210剩下一个4升到{5},{50}{51}{510},抛去10,{52}{520}{521}{5210},抛去210,{53}。。。。。。。。。。。

具体步骤在第3页最后个楼。
----------------解决方案--------------------------------------------------------
回复:(无玩过界)to:zcs302,也有BUG12345##########...

谢谢你,真的很感谢你,你帮我发现了不少问题了,现在已经改过来了,同时,我在调试的时候又发现了一个bug:当处理的时候,要是当前行已经删除完了(所有字符都废弃)最后还留下一个回车,最后也让我改过来了,值得庆祝
请大家在帮忙看看还有什么bug,程序在46楼,谢谢
现在把修改的部分在这再说一下:
else if(*(p+i)=='#') //处理退格符
{
if(*(p+i-1)=='\n' || outlen==0) //行首出现#的情况
continue;
else
outlen--; //一般情况
}
//该部分改为
else if(*(p+i)=='#')
{
if(outlen-1==enter || outlen==0)
//同是对行首的识别,但现在是从输出上判断,原先的是从输入上判断
continue;
else
outlen--;
}
///////////////////////////////////////////////////////////////////////////////
if(*(p+i)!='#'&&*(p+i)!='@') //把普通字符和特殊功能字符区分
{
if(*(p+i)=='\n')
{
enter=outlen; //记录最近一行结束的位置(即回车的地方)
//退行符将会用到
}
*(p+outlen++)=*(p+i); //用有用的字符覆盖掉应删除的字符
}
//修改以克服废弃整行字符却还留下回车符的情况(如123456@回车)
if(*(p+i)!='#'&&*(p+i)!='@')
{
if(*(p+i)=='\n')
{
if(outlen-1==enter)//判断此行是否已经为空
continue;
else
{
enter=outlen;
*(p+outlen++)=*(p+i);
}
}
else *(p+outlen++)=*(p+i);
}
希望大家帮忙改进一下


----------------解决方案--------------------------------------------------------
还有一种思路,先看看这个:
2的1次方2: 0
2的2次方4: 1 0
2的3次方8: 2 1 0
2的4次方16: 3 2 1 0
2的5次方32: 4 3 2 1 0
2的6次方64: 5 4 3 2 1 0
2的7次方128: 6 5 4 3 2 1 0
2的8次方256: 7 6 5 4 3 2 1 0
2的9次方512: 8 7 6 5 4 3 2 1 0
2的10次方1024: 9 8 7 6 5 4 3 2 1 0
拿512来说:8 7 6 5 4 3 2 1 0
511 8 7 6 5 4 3 2 1 少了0
510 8 7 6 5 4 3 2 0 少了1
509 8 7 6 5 4 3 2 少了1 0
508 8 7 6 5 4 3 1 0 少了2 512-508=4=2的平方
507 8 7 6 5 4 3 1 少了2 0
488 8 7 6 5 2 1 0 少了4 3 512-488=24=2的4次方+2的3次方
486 8 7 6 5 2 0 少了4 3 1 512-486=2的4次方+2的3次方+2的1次方

[此贴子已经被作者于2007-3-13 17:04:42编辑过]


----------------解决方案--------------------------------------------------------
to:zcs302:123456@123456###############也是BUG
----------------解决方案--------------------------------------------------------

比第一个思路好点,能快些,但是看结果而得来的,是不是巧合,我试了很多次都跟第一个的结果一样。
这里就不用换算成3的次方了,大家改正下
#include "math.h"
#include "stdio.h"
struct st
{
int i;
struct st *next;
struct st *qian;
}*st1,*a,*b;
printxulie(struct str *xulie) //输出最后结果集
{
struct str *pa;
pa=xulie;
if(pa->qian==0) printf("%d ",pa->i);
else
for(;pa!=0;pa=pa->qian)
printf("%d ",pa->i);
printf("\n");
}
quchu(struct st *xulie,int n)
{
struct st *pa,*pb;
pb=xulie;
if(pb->i==n) //当要去掉的是链表头一个时
{
st1=pb->next;
pb->next->qian=st1;
st1->qian=0;
pb->qian=0;
pb->next=0;
free(pb);
}
else
while(pb->next!=0)
{
if(pb->next->i==n)
{
pa=pb->next;
pb->next=pb->next->next;
pb->next->qian=pb;
pa->next=0;
pa->qian=0;
free(pa);
break;
}
else pb=pb->next;
}
}
main()
{
int i;
long cha,wei,n;
scanf("%ld",&wei);
while(wei>1)
{
for(cha=wei,i=0;cha>pow(2,i-1);i++) //cha小与wei的情况下,纪录i到链表st1中
{
b=(struct st*)malloc(sizeof(struct st));
b->i=i;
if(i==0) st1=a=b;
else
{
a->next=b;
b->qian=a;
}
b->next=0;
a=b;
} //st1是链表头地址a是尾地址
a->qian->next=0;
a=a->qian;
a->next=0;
b->next=0;
b->qian=0;
free(b);
i=i-1;
if(cha==pow(2,i)) //cha=pow(2,i),直接输出链表st1
printxulie(a);
else
{
cha=(long)(pow(2,i)-cha);
for(;cha!=0;)
{
i=i-1;
for(;cha<=(long)pow(2,i);i--);
i=i+1;
if(cha==(long)pow(2,i))
{
quchu(st1,i); //st1里除去i;
printxulie(a);
break;
}
else
{
for(;(long)pow(2,i)>=cha;i--);
cha=cha-(long)pow(2,i);
quchu(st1,i);
i=i+1;
}
}
}
scanf("%ld",&wei);
if(wei<1) break;
for(;st1!=0;st1=st1->next);
}
}

[此贴子已经被作者于2007-3-13 18:59:12编辑过]


----------------解决方案--------------------------------------------------------
以下是引用iwfy在2007-3-13 13:41:57的发言:
还有一种思路,先看看这个:
2的1次方2: 0
2的2次方4: 1 0
2的3次方8: 2 1 0
2的4次方16: 3 2 1 0
2的5次方32: 4 3 2 1 0
2的6次方64: 5 4 3 2 1 0
2的7次方128: 6 5 4 3 2 1 0
2的8次方256: 7 6 5 4 3 2 1 0
2的9次方512: 8 7 6 5 4 3 2 1 0
2的10次方1024: 9 8 7 6 5 4 3 2 1 0
拿512来说:8 7 6 5 4 3 2 1 0
511 8 7 6 5 4 3 2 1 少了0
510 8 7 6 5 4 3 2 0 少了1
509 8 7 6 5 4 3 2 少了1 0
508 8 7 6 5 4 3 1 0 少了2 512-508=4=2的平方
507 8 7 6 5 4 3 1 少了2 0
488 8 7 6 5 2 1 0 少了4 3 512-488=24=2的4次方+2的3次方
486 8 7 6 5 2 0 少了4 3 1 512-486=2的4次方+2的3次方+2的1次方

这个我看懂了,
----------------解决方案--------------------------------------------------------

  相关解决方案