一个改错问题,高手快进

来源:百度知道 编辑:UC知道 时间:2024/04/30 11:44:59
有17个人围成一个圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去。直到最后只剩下一个人为止。问此人原来的位置是多少号?

void main()
{ int i,j=0,k=0,x[17]; /*i为报数的次数,j为跳过的人数,i+j即为走过的人数,k为离开的人数*/
for(i=0;i<17;i++)/*用x[n]表示最初的所有人,1表示还在,0表示离开*/
x[i]=1;

for(i=1;k<16;i++)
{ while(x[(i+j)%17]==0)
j++;
if(i%3==0)
{ x[(i+j)%17]=0;
k++;
}
}

for(i=0;x[i]!=1;i++);

cout<<i;

}
答案应该为10,一个输出为11.到底是谁是错?错了应该怎样改?
可否将整个正确答案发上来

改两个地方:

void main()
{ int i,j=0,k=0,x[17];
for(i=0;i<17;i++)
x[i]=1;
for(i=0;k<16;i++) /************/
{
while(x[(i+j)%17]==0)
j++;
if(i%3==2) /*********/
{
x[(i+j)%17]=0;
k++;
}
}
for(i=0;x[i]!=1;i++);
cout<<i;
}
或者:
void main()
{ int i,j=0,k=0,x[17];
for(i=0;i<17;i++)
x[i]=1;
for(i=1;k<16;i++)
{
while(x[(i+j-1)%17]==0) /************/
j++;
if(i%3==0)
{
x[(i+j-1)%17]=0; /*********/
k++;
}
}
for(i=0;x[i]!=1;i++);
cout<<i;
}

你第0个人开始报数,报的是1
而你让i%3==0的人离开,那么第一个出列的人是位置为3的人。这显然错了,应该是位置为2的人出列
这个程序要改的话不好改,重写吧
数组下标从0开始的事实和报数从1开始要注意处理好。

你这道题,用链表更容易实现.或者递归,也不错.
发现你写的程序完全没规则,乱七八糟的!
写程序注意下格式.

x[0]的位置还是有走过的 你没有他它跳过

祝你好运