教徒与非教徒的生存问题(数组解)

17世纪法国数学家加斯帕在《数学的游戏问题》中讲的一个故事:n个教徒和n个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:2n个人围成一个圆圈,从第一个人开始依次循环报数,每数到第九个人就将他扔入大海,如此循环直到仅剩n个人为止 。问怎样的排法,才能使每次投入大海的都是非教徒。


【输入】输入文件由一行构成,就是n的值。 


【输出】输出文件中是一行字符串,字符串由n个‘@’字符(代表教徒)和n个‘+’ 字符(代表非教徒)排列构成。该排列使得按照前面的约定每次投入大海的都是非教徒。




【输入范例】15 


【输出范例】@@@@+++++@@+@@@+@++@@+++@++@@+

代码如下:

#include<stdio.h>
#include<string.h>
int main()
{
	int i,flag,n,count;
	char a[100100];
	printf("本程序实现对教徒和非教徒的位置确定\n");
	printf("please put in a number n:\n");
	scanf("%d",&n);
	count=2*n;
	memset(a,'@',count);/*先讲2n个人都初始化为教徒*/
	a[count]='\0';
	for(flag=0,i=0;count>n;i++)/**/
	{
		if(i==2*n)i=0;/*如果数到最后就重头,以达到数组头尾相连*/
		if(a[i]=='@')/*继续数还没被扔下去的人*/
			flag++;
		if(flag==9)/*数到第九个,被扔,此位置为非教徒*/
		{
			a[i]='+';/*非教徒*/
			count--;
			flag=0;/*重置计数的数*/
		}
	}
	printf("%s\n",a);
	return 0;
}

猜你喜欢

转载自blog.csdn.net/sifangege/article/details/80100416