码迷,mamicode.com
首页 > 编程语言 > 详细

算法训练 筛选号码

时间:2016-05-26 14:34:40      阅读:234      评论:0      收藏:0      [点我收藏+]

标签:

问题描述
  有n个人围成一圈,顺序排号(编号为1到n)。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子。从下一个人开始继续报数,直到剩下最后一个人,游戏结束。
  问最后留下的是原来第几号的那位。
  举个例子,8个人围成一圈:
  1 2 3 4 5 6 7 8
  第1次报数之后,3退出,剩下:
  1 2 4 5 6 7 8 (现在从4开始报数)
  第2次报数之后,6退出,剩下:
  1 2 4 5 7 8 (现在从7开始报数)
  第3次报数之后,1退出,剩下:
  2 4 5 7 8 (现在从2开始报数)
  第4次报数之后,5退出,剩下:
  2 4 7 8 (现在从7开始报数)
  第5次报数之后,2退出,剩下:
  4 7 8 (现在从4开始报数)
  第6次报数之后,8退出,剩下:
  4 7 (现在从4开始报数)
  最后一次报数之后,4退出,剩下:
  7.
  所以,最后留下来的人编号是7。
输入格式
  一个正整数n,(1<n<10000)
输出格式
  一个正整数,最后留下来的那个人的编号。
样例输入
8 
样例输出
7 
数据规模和约定
  对于100%的数据,1<n<10000。
测试代码1
 1 #include <stdio.h>  
 2 
 3 int main()
 4 {
 5     int num[50];
 6     int i, k, m, n;
 7     int *p;
 8     scanf("%d", &n);
 9     p = num;
10     for (i = 0; i<n; i++)
11     {
12         *(p + i) = i + 1;   //以1至n为序,给每个人编号  
13     }
14     i = 0;    //i为每次循环时计数变量  
15     k = 0;    //k为按1 2 3报数时的计数变量  
16     m = 0;    //m为退出人数  
17     while (m < n - 1)  //当退出人数比n-1少时(即未退出人数大于1时)执行循环体  
18     {
19         if (*(p + i) != 0)
20         {
21             k++;
22         }
23         if (k == 3)    //将退出人的编号置为0  
24         {
25             *(p + i) = 0;
26             k = 0;
27             m++;
28         }
29         i++;
30         if (i == n)
31         {
32             i = 0;//报数到尾后i恢复为0  
33         }
34     }
35     while (*p == 0)
36     {
37         p++;
38     }
39     printf("%d\n", *p);
40     return 0;
41 }
测试代码2
 1 #include <stdio.h>
 2 #define M 3
 3 
 4 int main()
 5 {
 6     int n, i, s = 0;
 7     scanf("%d", &n);
 8     for (i = 2; i <= n; i++)
 9     {
10         s = (s + M) % i;
11     }
12     printf("%d\n", s + 1);
13     return 0;
14 }

 

算法训练 筛选号码

标签:

原文地址:http://www.cnblogs.com/maxin/p/5530839.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!