有一条不明白的程序.

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

答案为:
#include <iostream.h>
void main()
{
int i,test,p[17],head;
for(i=0;i<16;i++)
p[i]=i+1;
p[16]=0;
test=0;
while(test!=p[test])
{
for(i=1;i<3;i++)
{
head=test;
test=p[test];
}
p[head]=p[test];
test=p[head];
}
cout<<"最后一个人的原来序号为"<<test<<endl;
}
高手可不可以为我分析一下,我看了很久也不明白~
同样这个程序也应该可以 #include <iostream.h>
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;

i++后
i是等于i+1的.!
并不是noyeya110所说那样
如果 int a = a[i++];
这才是 a 等于 a[i];
在一个表达式里是先引用后自加.

**************************************************
数组实现:
count是存留的人数,
每个出去的人会被记号为-1,
你运行下程序就知道过程了
结果应该是10
***************************************************

#include <stdio.h>
int main()
{
int arr[17];
int i,n,count=17;
for(i=0;i<17;i++)
arr[i] = i;
for(i=0,n=1;count;i++,n++)
{
i = (i+17)%17;
if((arr[i] != -1) && n == 3)
{
arr[i] = -1;
count--;
n = 0;
for(int j=0;j<17;j++)
printf("%d,",arr[j]);
printf("\n");
}
else if(arr[i] == -1)
--n;
}
printf("The lucky number is %d\n",i-1);
return 0;
}

*********************************************************************
还有疑问请补充提问,没用了请及时处理问题。
*****************************