本帖最后由 liulunjiang 于 2015-10-24 09:13 编辑
围圈报数这个问题大家肯定遇到过,我贴一个自己写的简单的程序,供参考。
15人围圈报数,报到3的退出并继续重新从1开始报,最后剩下谁? 可以自行拓展成n个人报数,报到m退出。
- #include <stdio.h>
- #include <string.h>
- int main(int argc, const char * argv[]) {
- //报数累加器
- int count=1;
- //在场人数
- int numRemain=15;
- //定义并初始化报数标记数组,对应15个位置的人,若为1则可以参与报数,若为0表明此人已退出,不能参与保护
- int flag[15];
- for (int i=0; i<15; i++) {
- flag[i]=1;
- }
- //i为每个人对应的下标
- for (int i=0; ; i++) {
- //i为15时,即完成一圈,下标重新归位
- if (i==15){
- i=0;
- }
- //如果报数标记值为0,表示此人已退出,不参加报数
- if (flag[i]==0){
- continue;
- }
- //如果在场人数剩下1个,则此人是叛徒,输出序号并退出循环。
- if (numRemain==1){
- printf("最后剩下的人的序号是:%d\n",i+1);
- break;
- }
- //报数到3时,对应的报数标记置0,此人退出之后的报数,报数累加器重新置1,在场人数减1
- if (count==3) {
- flag[i]=0;
- count=1;
- numRemain--;
- }else{
- count++;
- }
- }
- return 0;
- }
复制代码
|
|