您的位置:首页 > 其它

有n个人围成圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,最后留下的是原来第几号的那位.

2018-01-27 16:52 288 查看
这是刚开始学C语言的经典问题,下面还参考了网上的答案,有三种总结如下:
1.用数组做,数组地址与对应值不变,用另外两个变量对数到3的进行判定;
#include<stdio.h>
int main(){  int a[100]; int i,n,p=0,q; printf("input number:"); scanf("%d",&n); q=n;  for(i=0;i<n;i++)      a[i]=i+1;  for(i=0;;i++)  {  if(i==n)  i=0;                           //当i++到n时,肯定有一些没有被选到,如我们输入8,第一轮3,6被赋值0,当i=8时,继续下一轮//  if(a[i]!=0) p++;     //我们下面定义的是当循环到三时,就赋值0,所以这边等0的不考虑在内// else continue; if(p%3==0)  //这个就是从0一直加,到三的倍数就赋值为0,从而就达到我们的目的//   {a[i]=0;q--;}                 //上面q=n;表明q==n,只有一个为0就减一,为下面做铺垫//  if(q==1) break;           //当剩下最后一个就输出//  }  for(i=0;i<n;i++)  if(a[i]!=0) printf("spare: %d\n\n",a[i]); }2.用指针的方法,思路同用数组的一样,不过这个个人感觉相对优化了;1 #include<stdio.h>  2   3 int main()  4 {  5     int num[100];  6     int i,j,k,m,n;  7     int *p;  8   9     printf("Please input number:\n"); 10     scanf("%d",&n); 11  12     p=num; 13     for(i=0;i<n;i++) 14     *(p+i)=i+1;         //以1至n为序,给每个人编号       15     i=0;                //i为每次循环时计数变量     16     k=0;                //k为按1 2 3报数时的计数变量     17     m=0;                //m为退出人数   18     while(m<n-1)        //当退出人数比n-1少时(即未退出人数大于1时)执行循环体      19     { 20         if(*(p+i)!=0) 21         { 22             k++; 23         } 24         if(k==3)        //将退出人的编号置为0        25         { 26             *(p+i)=0; 27             k=0; 28             m++; 29         } 30         i++; 31         if(i==n) 32         { 33         i=0;            //报数到尾后i恢复为0                                     34         } 35     }36  37         while(0==*p) 38         { 39             p++; 40         } 41         printf("最后一个是%d号!\n",*p); 42         return 0; 43 }3.这个方法一般想不到;emmmmm#include <stdio.h>  int M = 3;int main(){   int n, i, s = 0; scanf("%d", &n); for (i = 2; i <= n; ++i) s = (s+M)%i; printf("%d\n", s+1); return 0;}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐