/*============================================================= 目的:有n个人围成一圈,顺序排号。从第一个人开始报数 (从1到3报数),凡报到3的人退出圈子,问最后剩下的是原来的几号 算法分析:1、 定义整形指针,输入人员总数和退出的幸运数字。 2、定义数组游标i,报号游标j,总退出人数计数器k 3、 从数组第一元素开始遍历,如果报号游标j=m,那么该元素为0,并且计数器k增加一个,直到剩余一个元素为止。 4、输出剩余元素的原来的序号。 ============================================================== 作者:最后的村长 时间:2009年10月12日 工具:DEV C++ 4.9.9.2 version:1.0 ==============================================================*/ #include <stdio.h> #include <stdlib.h>
/*=============================================================*/
/********************不幸运数u可以根据需要改变,人数不限制********************
程序如下:(说明,报数数为3退出,那么不幸运数是 u=3.) */
int luck_number(int n,int u) { /*该函数返回最后留下来的人的编号*/ /*其中, n是总人数,u是不幸运数(报数到该数退出)*/ int *pep,i,j,k; pep=(int *)malloc(n*sizeof(int)); for(i=0;i<n;i++) pep[i]=i+1; //初始化赋值
for(i=0,j=0,k=1;k<n;i++) { i=i%n; //保证i从1开始遍历,聪明!
if(pep[i]!=0) { j++;/*j是报数游标,*/ if(j%u==0) {printf("第%d个退出的是:%d\n",k,pep[i]);pep[i]=0;k++;}/*如果j=u,退出的人号码改为0,并k用来记录退出的人总数*/ } } for(i=0;i<n;i++) if(pep[i]!=0) break; return pep[i]; }
int main() { int n,u; printf("请输入人员总数: n= "); scanf("%d",&n); printf("请输入退出人员的号码: u= "); scanf("%d",&u); printf("幸运号是 : %d",luck_number(n,u));/*u是报数的时要退出的数*/ system("pause"); return 0; }
|