N个人围成一圈报数,这N个人的编号从1到N,先从第一个人报数,第一个人报1,第二个人报2, 报到M的人退出,然后又从下一个人开始从1开始继续报数,报到M的人退出,问最后剩下哪一个人? (N, M由用户输入)
#include<stdio.h>
#include<stdlib.h>
int main(void)
{ int i = 0,j = 0; int a[10000] = {0}; int N, M; int k=0; int tmp;
printf("Input n(n must be a natural number less than 10000):"); scanf("%d %d", &N, &M); if(N>10000) { printf("%d is out of range of valid values.\n", N); goto err0; } //给N个人编号 for(j = 1;j <= N; j++) { a[j]= j; printf("%d ", a[j]); } putchar('\n'); tmp = N; while(1) { do { j = M % tmp; printf("j = %d\n", j); // M % tmp > 0 需将退出人的位置在中间,
//需将退出人后面的人整体往前移一个标号 if(M % tmp > 0) { for(k = j; k <= tmp; k++) { a[k] = a[k + 1]; printf("%d %d\n", k, a[k]); } } tmp--; printf("tmp = %d\n", tmp); }while(tmp > 1); break; } //通过while()循环后,剩下的最后一个人必然是在a[1] 中 printf("The last NUMBER is %d\n", a[1]);
return 0;
err0: return -1;
}
以N = 8,M = 5为例,整个报数流程如下:
希望大家一起来交流学习,谢谢····