题目标题:
围圈报数(谌海军)
题目描述:
有n(n<=100)围成一圈,顺序排号(从1排到n)。从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,问最后留下的是原来第几号的那位?
输入描述:
输入为两个正整数,第一个<=100,第二个<=9;
输出描述:
输出为一个正整数;
样式输入:
100 3
样式输出:
91
编写代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include <stdio.h> 2 int main() 3 { 4 int i, n, m, k=0, cnt = 0, a[100] = {0}; 5 scanf("%d%d,", &n, &m); 6 for(i = 0; i < n; ++i) 7 {a[i] = i+1;} 8 while(cnt < n) 9 { 10 for(i = 0; i < n; ++i) 11 if(a[i]!=0) 12 { 13 k++; 14 if(k==m) {a[i]=0; k=0; cnt++;} 15 } 16 if(cnt==n-1) break; 17 else i=0; 18 } 19 for(i = n-1; i >= 0; --i) 20 if(a[i] != 0) printf("%d", a[i]); 21 return 0; 22 }
源代码:
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
1 #include<stdio.h> 2 int main() 3 { 4 int a[100]; 5 int n, m, i, sum = 0, k = 0; 6 scanf("%d%d", &n, &m); 7 for(i = 0; i < n; i++) 8 a[i] = i + 1; 9 while(sum >= 0) 10 { 11 for(i = 0; i < n; i++) 12 if(a[i] != 0) 13 { 14 k++; 15 if(k == m) {a[i] = 0; k = 0; sum++;} 16 } 17 if(sum == n-1) break; 18 else i = 0; 19 } 20 for(i = n-1; i >= 0; i--) 21 if(a[i] != 0) printf("%d", a[i]); 22 return 0; 23 }
解题思路:
1、定义一个长度为100数组a,初始化为0;
2、接收键盘输入值n,m,数组a的前n-1个元素赋值为1~n;
3、建立两层嵌套循环,外循环至退出人数为n-1为止,内循环中从0循环至n,将a数组中非0的数据逢m置零,同时记录退出人数;
4、循环全部结束后输出最后留下的一个a数组的非零元素的值。