本帖最后由 rocki 于 2014-7-26 19:02 编辑
- #include <stdio.h>
- #include <stdlib.h>
- int main(int argc, const char * argv[])
- {
- //声明报数函数
- int numberOff(int n,int m);
-
- //调用报数函数并打印叛徒编号,
- printf("叛徒是NO.%d\n",numberOff(15,3));
-
- return 0;
- }
- //n代表人数,m代表报数
- int numberOff(int n,int m)
- {
- int count = n;//count代表圈子内剩余的人数
-
- int flag=0;//当前报数
-
- int i,j;//i表示当前报数人下标
-
- int *a,traitor;//a表示N个人在圈子内。traitor代表最后剩下的叛徒
-
- //开辟动态链表,将空间首地址赋值给a
- a=(int*)malloc(n*sizeof(int ));
-
- for (i=0; i<n;i++)
- {
- a[i]=i+1;//a[i]保存i个人的编号
- }
- i=0;//从编号为0的人开始报数
-
- while (count>1)//当圈子内剩余人数大于1时执行循环
- {
- flag++;//开始报数
-
- if (flag==m)//报到m得人离开
- {
- //将当前报道m的人删除
- printf("%d号退出圈子\n",a[i]);
- for (j=i; j<count-1; j++)
- {
- a[j]=a[j+1];//删除报到M的人,表示退出圈子
- }
- count--;//圈子剩余人数-1
-
- flag=0;//报数置位,从新开始计数
-
- i-=1;
-
- }
- i= (i+1)%count;//计算下一个报数人得下标
- }
- traitor = a[0];//最后剩下一个人。把值赋给traitor
-
- return traitor;
- }
复制代码
希望对你有帮助,我那会是这么做得。 你可以尝试改下主函数。。多少人 报到多少退出都可以算。这题你把它先看成数学题找找算法。 |