1047 - C语言程序设计教程(第三版)课后习题10.5

1047 - C语言程序设计教程(第三版)课后习题10.5

时间限制:1秒
内存限制:128兆

题目描述
有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

输入
初始人数n
输出
最后一人的初始编号
样例输入

3

样例输出

2

一个简单的约瑟夫环问题,有专门的公式可以直接出答案,
但是我并不会(不好意思的笑了),所以我在写这道题的时
候用的是模拟的方法,比较麻烦但是应该可以看懂,思路是
把数组下标看作是第几个人,里面存自己报的数,如果报的
数为3,则数组赋值为0,代表淘汰 ;

#include<stdio.h>

#include<string.h>

int main()
{
	int a[1005], n, b=1, m, j=1, v, x;
		
	scanf("%d",&m);
 
 	memset(a,1,sizeof(a));                       //数组初始化为1,代表全部没有淘汰 
 
 	c=m;                    
 
 	while(c!=1)
 
 	{
  
  		c=0;                                     //c代表总人数,如果人数剩余为1,则输出 
  
  		for(int k=1;k<=m;k++)
  
  		{
   
			if(a[k]!=0)                          //如果不为0,则代表没有淘汰,继续报数 
   
   			{
    
    				a[k]=b;                         //b代表报的数是多少 
    
    				b++;
    
    				c++;
    
    				v=k;                            //记下没被淘汰人的下标,方便输出 
   
   			}
   
   			if(a[k]==3)                         //如果报的数为三则淘汰 
   
   			{
    
    				a[k]=0;
    
    				b=1;                            //b归为1,从新开始报数 
   
   			}
  
  		}  
 
 	}
 	
 	printf("%d\n",v);                          //输出剩余那个人的标号 
 
 	return 0;

}

猜你喜欢

转载自blog.csdn.net/w__000000wbt/article/details/83540479