C语言初体验(一)

来源:互联网 发布:淘宝店铺模板代码 编辑:程序博客网 时间:2024/05/29 08:17

 

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

 

 

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