C语言编程百科

http://clanguage.baike.com

文章
  • 文章
  • 站点

循环数组报数程序

2012-01-29 本文行家:玻尔特.李

报数程序,包括运行过程

目录

 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,在下一个序列中不再显示。       

分享:
标签: 计算机软件 | 收藏

本文行家向Ta提问

玻尔特.李软件专业硕士生,编程,计算机硬件设计,网络。

行家更新

百科的文章(含所附图片)系由网友上传,如果涉嫌侵权,请与客服联系,我们将按照法律之相关规定及时进行处理。如需转载,请注明来源于www.baike.com

互动在线 版权所有 © 2005-2012