报数程序,包括运行过程
n个人围成一圈,顺序排号,从第1个人开始报数,从1报到5,凡是报到5的人退出圈子,问最后的一个人是原来的第几号人?请编一个函数,n的值由main函数输入并通过实参传给该函数,最后结果由main()函数输出。
最后留下一个人,因为有两个人,循环排列,则可以12,34,5。
从1计数到5,用count表示计数器,当count=5,则元素的值=0
数组的遍历用指针的移动量,用p表示指针,用i++表示指针的移动量,实际指针没有遍历数组,而是用(p+i)表示对数组元素的遍历。
用out作为报数5的元素的计数器,每当从1计数到5,则out++,当out=n-1,停止报数。
用函数left(int *p,int n),是因为n的值是任意的。提高一步,报数到5,还能用m表示报数到m退出圈子,则用函数left(int *p,int n,int m)。
main()
{void left(int *p,int n);
int num[100],n,i;
printf(“how many people? ”);
scanf(“%d”,&n);
for(i=0;i<n;i++) //初始化数组num[0]=1
num[i]=i+1;
left(num,n);
for(i=0;i<n;i++)
if(num[i]!=0)
printf(“No. which lest last if %d”,num[i]);
}
void left(int *p,int n) //p=num
{
int i,out,count;
i=0;
out=0;
count=0;
while(out<n-1)
{if(*(p+i)!=0) //当*(p+i) !=0,元素没有退出
count++; // count计数1
if(count==5)
{
*(p+i)=0; //当报数到5退出圈子,*(p+i)=0
count=0; // count从0开始计数
out++;
}
i++; //循环排列,游标i等于n时,指针应到队首,重新
开始计算。指针p不是数组的遍历指针,而是用游、标i的方法。
if(i==n) i=0;
}
}
运行结果:
how many people?
20
No. which left last is 7
1. n个人围成一圈,没有用循环数组的方法,num[n-1]≠0,而是用指针移动的方法,当if(i==n)时,游标i=0,重新开始计算位移。
2.out的作用
用out++表示报数到5的元素的个数,当out=n-1时,报数停止。用作程序的while循环。
3.程序运行的过程
12345 678910 11 12 13 14 15 16 17 18 19 20 i
count 12340 1234 0 1 2 3 4 0 1 2 3 4 0 5 10 15 20
1234 0123 4 0 1 2 3 4 0 1 6 12 18
2340 123 4 0 1 2 3 4 4 13
012 340 1 2 3 4 0 1 9 19
12 34 0 1 2 3 11
40 12 3 4 0 3 17
1 23 4 0 16
1 23 4
0 12 3 2
40 1 8
2 3
4 0 14
1
注释:前一次报数到5的0,在下一个序列中不再显示。