有n个人围成一圈,按顺序从1到n编号。从第一个人开始报数,报数3的人退出圈子,下一个人从1开始重新报数,报数3的人退出圈子。如此循环,直到留下最后一个人。问留下来的人的编号。
【输入形式】
考虑如下两种情况:
如果n超出“n must be a natural number less than 10000”,则打印“n is out of range of valid values.”;其中n应该用如上输入的具体的n数值代替;换行;
如果n是有效范围的数值,则打印“Last No. is:”;然后直接在冒号后面输出最后留下来的人的编号;换行;
【运行时的输入输出样例1】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):5
Last No. is:4
【运行时的输入输出样例2】(下划线部分表示输入)
Input n(n must be a natural number less than 10000):100000
100000 is out of range of valid values.
我的程序为什么死循环啊....刚学指针,求改正,
#include <stdio.h>
#define N 9999
int main()
{
int n,a[N],*p,i=0,out=0,count=0;
printf("Input n(n must be a natural number less than 10000):");
scanf("%d",&n);
if(n>=10000)
printf("n is out of range of valid values.");
else
{
for(i=0;i<=n;i++)
a[i+1]=i;
p=a;
while(out!=n){
if(*p!=0)
count++;
if(count==3){
out++;
*p=0;
}
count=0;
p++;
if(*p==a[n-1])
p=a;
}
printf("%d",*p);
}
return 0;
}
修改后——————》
else
{
for(i=0;i<=n;i++)
a[i]=i;
p=a;
while(out!=n-1){
for(;;){
if(*p!=0){
count++;
p++;
}
if(count==3){
out++;
*p=0;
count=0;
break;
}
if(*p==a[n-1])
p=a;
}
}
printf("%d",*p);
}
我重新根据你的改了下,还是死循环,逐步调试后,if(*p!=0)这个,全部被跳过了...
可是明明p是指向a[]的啊...然后就死循环了..
还有那个for(;;)是什么意思,没有判断等语句,不是等于没有用么?.
确实不行,因为*p==0的情况没有处理,这样遇到一个*p==0就一直死循环了
至于那个for循环的判断语句在循环里面,就是那个break;也可以用while(1)来代替
把p=a;改为p=&a[1];后面循环写成下面这样看看
while(out!=n-1)
{
while(1)
{
if(*p!=0)
count++;
if(p==&a[n])
p=&a[1];
else
p++;
if(count==3)
{
if(p==&a[1])
a[n]=0;
else
p--;
out++; //在这儿家加上printf("%d->",*p);就可以把顺序打出来了
*p=0;
break;
}
}结束while(1)
count=0;
}结束while(out!=n-1)
for(i=1;i<=n;i++)
if(a[i]!=0)
printf("%d",a[i])
这样应该就没问题了把,我自己没测试过你可以试试,还有问题的话在找我,不对管换而且没期限限制,呵呵呵大家多交流啊
这个我试过了OK
这个貌似不是C语言吧...看不懂饿...或者是我还没交到..p->a=i;之类的...
追答是C语言,你自己运行以下就知道了,只有cin和cout语句是C++扩充的,这个我在上面就说过了,主体思路是用动态单向链表做的,就是你说的那个p->a=i;之类的,别慌,后面会教,等你指针弄熟了很简单的