17个人编号从1到17围坐一圈,从编号1的人开始连续报数,数到7的罚下,下一个接着从一开始数,还是数到7的罚下。问最后省的是几号! 高手们~最好用数组解答
#include <stdio.h> #include <stdlib.h> main () { int a[17], b[17]; int i, del = -1, sum; for (i = 0; i <= 16; i++) { a[i] = i + 1; //数组a记录编号 b[i] = 1; //数组b标记是否出局 } printf("Pass:"); for (sum = 17; sum > 1; sum--) { //总人数递减,直到只剩一人 for (i = 1; i <= 7;) { //在未出局的人中以7为轮次循环 del = (del + 1) % 17; //后移下标,并控制在0~17之间 if (b[del] == 1) i++; } printf(" %d", a[del]); b[del] = 0; } for (i = 0; b[i] == 0; i++); //找出未出局的编号 printf("\nThe winner is: %d\n\n", a[i]); system("pause"); } /* * 或者只定义一个数组,用来记录编号,通过数组内部的移动来实现 */ #include <stdio.h> #include <stdlib.h> main() { int sum, a[17], i, del = 0; for (i = 0; i <= 16; i++) a[i] = i + 1; printf("Pass:"); for (sum = 17; sum != 1; sum--) { del = (del + 6) % sum; //将下标后移6位,并控制在0~17之间 printf(" %d", a[del]); for (i = del; i <= sum - 2; i++) a[i] = a[i+1]; //后面的元素依次向前移一位,填补出局编号的位置 } printf("\nThe winner is: %d\n\n", a[0]); system("pause"); }