约瑟夫问题:15个基督徒和15个异教徒在海上遇险,必须将一半的人投入大海,其余的人才能幸免于难:30个人围成一个圆圈,从第一个人开始依次报数,每数到第9个人就将他扔入大海,如此循环直到仅余15个人为止

问怎样排法,才能使每次投入大海的都是异教徒。
提示:①30个人顺序编号,自增量k报数,k%9==0时,此人投入大海。投入大海标志为置数组元素值为0(或-1)。投入大海的人不再报数。
程序输出要求:程序运行后,显示原始顺序,每次投入大海的人的信息及剩下人的顺序,(使用一维数组).
据提示内容可分析出,相当于这30个人站成一列,然后在数出第九个人的时候.整个队列开始重新报数,并且在投入大海的那个人之前的人依次前往队伍的最后。但是由于要求使用一维数组完成,所以需要将计数变量达到30时,将计数变量置为0,避免数组越界。

1 为基督徒,0 为异教徒。

提前将所有会报9的位置的人都安排为异教徒:

	for(i=1,count=0,t=0;;i++)
	{
		if(a[i]=='1')
		t++;           //所有人围成一个圈,当数到的人是基督徒时,计数器t++
		if(t%9==0)
		{
			a[i]='0';      //将投入大海的位置标记为0,也就是异教徒;
			count++;   //如果数的人是9的倍数,投入大海的人数count++; 
		 } 
		 if(i==30)     //当i==30的时候,需要将i重置为零,否则数组便会越界;
		  i=0;
		 if(count==15) //投入15个人了,跳出循环;
		  break; 
	 } 

将安排好位置的队列拿出来逢9的倍数便将异教徒投入大海。

for(i = 1,t = 0,count = 0;;i++)
	{
    
    
		if(a[i]!=' ')
		t++;                //t相当于数的人; 
		if(t%9 == 0)
		{
    
    
			a[i]=' ';			//第九个位置的人要投入大海,因投入大海的人不再报数,所以将投入大海的人的位置空出来. 
			count++;           //投入大海的人数++ 
			printf("第%d次投入大海:\n",count);
			for(j = 1;j <= 30;j++)
			printf("%c",a[j]);
			printf("\n");
			printf("\n");
		}
		if(i == 30)
		i=0;
		if(count == 15)
		break;
	}

完整代码:

#include<stdio.h>
int main()
{
    
    
	int i,t,j;
	char a[30];
	for(i = 1;i <= 30;i++)
	a[i]='1';           //首先令所有人都是基督徒
	int count;
	for(i = 1,count = 0,t = 0;;i++)
	{
    
    
		if(a[i] == '1')
		t++;           //所有人围成一个圈,当数到的人是基督徒时,计数器t++
		if(t%9 == 0)
		{
    
    
			a[i] = '0';   //将投入大海的人的位置置数组元素值为0 
			count++;   //如果数的人是9的倍数,投入大海的人数count++; 
		 } 
		 if(i == 30)     //当i==30的时候,需要将i重置为零
		 i=0;
		 if(count == 15) //投入15个人了,跳出循环
		 break; 
	 } 
	 printf("\n");
	for(i = 1,t = 0,count = 0;;i++)
	{
    
    
		if(a[i]!=' ')
		t++;                //t相当于数的人; 
		if(t%9 == 0)
		{
    
    
			a[i]=' ';			//第九个位置的人要投入大海,因投入大海的人不再报数,所以将投入大海的人的位置空出来. 
			count++;           //投入大海的人数++ 
			printf("第%d次投入大海:\n",count);
			for(j = 1;j <= 30;j++)
			printf("%c",a[j]);
			printf("\n");
			printf("\n");
		}
		if(i == 30)
		i=0;
		if(count == 15)
		break;
	}
	return 0;
}

对我的博客或其他方面有任何见解或问题的话都可以私信我
或者联系本人QQ:3128909688
微信:DreamHerome
欢迎致电

猜你喜欢

转载自blog.csdn.net/RViewSonic/article/details/107647718