调试程序时遇到一个很古怪的问题。
/*n个人围成一圈,顺序排号,从第1个人开始报数(从1到3报数),
凡报到3的人退出圈子,问最后留下的是原来第几号的那个人。*/
我输入的人数是n为8,并且在程序中设定了 k<=n-1,结果在调试时,居然发现k值能取到14,
好奇怪啊啊啊。
#include <stdio.h>
int main()
{ int turn(int );
int n;
printf("how many people are there?\n");
scanf("%d",&n);
printf("the last number is:%d\n",turn(n));
system("pause");
return 0;
}
int turn(int n)
{ int *p,array[100],i,m,k;
for(p=array,i=0;i<n;i++)
*(p+i)=i+1;
for(i=0,m=1;n>=3&&*(p+i)!='\0';i++,m++)
{ if(m==3)
{ for(k=i;k<=n-1;k++)
*(p+k)=*(p+k+1); //我输入的n是8,为什么调试的时候k值能取到14呢?
*(p+n-1)='\0';
n--; //随着筛选,总个数逐渐减少。
m=0;
}
if(*(p+i+1)=='\0'&&n>=3) i=-1; //要是下一个数为空,就返回第一个数继续筛选。
}
return i+1;
}
[解决办法]
建议用链表做这题,你写的我看着有点乱。
[解决办法]
#include <stdio.h>int main(){ int turn(int ); int n; printf("how many people are there?\n"); scanf("%d",&n); printf("the last number is:%d\n",turn(n)); system("pause"); return 0; }int turn(int n){ int *p,array[100],i,m,k; for(p=array,i=0;i<n;i++) *(p+i)=i+1; *(p+i)='\0';//放到这儿 for(i=0,m=1;n>=2&&*(p+i)!='\0';i++,m++) //最后只能有一个数留下,所以n>=2. { if(m==3) { for(k=i;k<=n-1;k++) *(p+k)=*(p+k+1); //*(p+8)=? //*(p+n-1)='\0'; n--; m=0; i--;//你把数组里的数删除了,i最后还要加1,所以这儿先减1. } if(*(p+i+1)=='\0'&&n>=2) i=-1; //return i+2; return array[0];//}//既然会调试,那为啥你找不出原因呢?