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;
}