C语言初体验(一)

xiaoxiao2021-02-28  113

 

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为例,整个报数流程如下:

 

 

希望大家一起来交流学习,谢谢····

 

 

 

 

转载请注明原文地址: https://www.6miu.com/read-63967.html

最新回复(0)