作为一名交大计算机的大一新生,每次网站查看答案都要花10个金币,于是我决定将网站的答案写下来(不是标答,本人自己写的)造福大家。有问题欢迎指正TT
*约瑟夫问题。这是十七世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个基督教徒和15个异教徒在海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了个办法:30个人围成一个圆圈,从第一个人开始依次报数,每数到第9个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是异教徒。 本题示例为 @ @ @ @ + + + + + @ @ + @ @ @ + @ + + @ @ + + + @ + + @ @ + (第一个人前无空格,每人中间1个空格) **输出格式要求:"The original circle is (+:papandom, @:christian);\n" "%c "
//约瑟夫问题
#include<stdio.h>
struct human{
int flag;
int numbernext;
};
struct human link[31];//用31是因为不用link【0】,方便理解是第几个人 //当然用30也可以
int main(){
int i,j,k;
for(i=1;i<=30;i++){
link[i].flag=1;//1就代表这个人还活着,0就代表嘎了
link[i].numbernext=i+1;
}
link[30].numbernext=1;//这样就形成了一个圈
j=30;
for(i=0;i<15;i++){//控制游戏次数
k=0;//用k表示报数
while(1){
if(k<9){//代表报数的过程
j=link[j].numbernext;
k+=link[j].flag;
}else{
break;
}
}
link[j].flag=0;
}
printf("The original circle is (+:papandom, @:christian);\n");
for(i=1;i<=30;i++){
printf("%c",link[i].flag ? '@' : '+');//若flag正确(即为一)则输出@,若错误(即为0)输出+
}
printf("\n");
return 0;
}
运行结果如下: