算法1: /*求围圈问题的详细算法和程序*//*17人围成一圈,编号为1,2,3,……,17,从1开始报数,报到3的倍数的人离开,一直下去,直到最后剩下1人,求此人的编号 */#include <stdio.h>#include <stdlib.h> int main(void){ int a[17]={0}; int i, count, s; for (i = 0;i < 17;i++) { a[i] = i + 1; /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */ } i=0; s=17; //用来记录退出圈外的人的数目 count=0; //计数器 while(s > 1) { for(i=0; i<17; i++) if(a[i] != 0) { count++; //报一次数 if(count == 3) //每报到一次3,该人退出 { printf("%d\n",a[i]); /* 把这个家伙打印出来 */ a[i] = 0; count = 0; //计数器归零 s--; } } } for(i=0; i<17; i++) if(a[i] != 0) printf("最后一个是:%d\n",a[i]); system("pause"); return 0; } 算法2: /*求围圈问题的详细算法和程序*//*17人围成一圈,编号为1,2,3,……,17,从1开始报数,报到3的倍数的人离开,一直下去,直到最后剩下1人,求此人的编号 */#include <stdio.h>#include <stdlib.h> int main(void){ int a[17]={0}; int i, j, s; for (i = 0;i < 17;i++) { a[i] = i + 1; /* 填空数组,编号是下标加一,注意C语言中的数组下标从0开始 */ } i=0; s=17; j=0; while(s > 1) { if(a[i%17] != 0) { if((i+1-j)%3 == 0) { printf("%d\n",a[i%17]); /* 把这个家伙打印出来 */ a[i%17] = 0; s--; } } else j++; i++; } for(i=0; i<17; i++) if(a[i] != 0) printf("最后一个是:%d\n",a[i]); system("pause"); return 0; }

评论