C语言初体验(一)
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为例,整个报数流程如下:
希望大家一起来交流学习,谢谢····