算法训练 筛选号码

Posted 新生代黑马

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了算法训练 筛选号码相关的知识,希望对你有一定的参考价值。

问题描述
  有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 }

 

以上是关于算法训练 筛选号码的主要内容,如果未能解决你的问题,请参考以下文章

R语言基于遗传算法(Genetic Algorithm)进行特征筛选(feature selection)

JavaScript从内容中筛选出手机号码集合

微号检测 手机号码微信筛选

图解 | 17个机器学习的常用算法

一套基于java的开源车牌识别算法

C++-筛选文件夹中符合要求的文件并拷贝出来(以手机号码查找为例)