*约瑟夫问题。【西交网站题】

作为一名交大计算机的大一新生,每次网站查看答案都要花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;
} 

 运行结果如下:

  • 9
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值