长理ACM 13-围圈报数(谌海军)

题目标题:
围圈报数(谌海军)

题目描述:
有n(n<=100)围成一圈,顺序排号(从1排到n)。从第一个人开始报数(从1报到m(m<=9)),凡报到m的人退出圈子,问最后留下的是原来第几号的那位?

输入描述:
输入为两个正整数,第一个<=100,第二个<=9;

输出描述:
输出为一个正整数;

样式输入:
100 3

样式输出:
91

编写代码:

 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 }
View Code

源代码:

 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 }
View Code

解题思路:
1、定义一个长度为100数组a,初始化为0;
2、接收键盘输入值n,m,数组a的前n-1个元素赋值为1~n;
3、建立两层嵌套循环,外循环至退出人数为n-1为止,内循环中从0循环至n,将a数组中非0的数据逢m置零,同时记录退出人数;
4、循环全部结束后输出最后留下的一个a数组的非零元素的值。

亲爱的读者:如果觉得本文对你有所帮助,请点击推荐,分享给其他人!
原文地址:https://www.cnblogs.com/zhuangwei/p/5270975.html