⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄

📁 C语言相关程序
💻
字号:
问题的提出:17世纪法国数学家加斯帕的一本《数学的游戏问题》描述了许多有趣问题,约瑟问题就是其中之一: 
15名基督教徒和15名异教徒同乘一船航行,途中风浪大作,危机万分,领航者告诉大家,只要将全船的一半人投入海中,其余人就能幸免。大家都同意这个办法,并协定者30人围成一圈;由第一个人起报数,每数至第9人便把他投入海中,下一个接着从1开始报数,第9人又被投入海中,依次循环,直至剩下15人为止。问题是如何排法使投入海中的人全为异教徒? 
编程的思路:此问题有人把它的答案隐示于下列诗句中: 
From numbers’ aid and art, (依靠数字的和魔力,) 
Never will fame depart! (声誉决不会离你而去!) 
这句诗中元音字母依次为:oueaiaaeeiaeea,分别用1、2、3、4、5代替a、e、i、o、u,便得一排数(划线得数字表示基督教徒,不划线的表示异教徒)。 
4 5 2 1 3 1 1 2 2 3 1 2 2 1 故所求排法诗4个基督教徒,5个异教徒,再2个基督教徒,1个异教徒,…可以证明,这种排法所有的基督教徒都是安全的。 

#include <iostream.h> 
void main() 
{ 
int i,k,m,s,sh,num[30],sea[15],ship[15]; 
for (i=0;i<30;i++) 
num[i]=i+1; //1至30给每人编号 
i=0; //i为每次循环时计数变量 
k=0; //k为按1,2...9报数时计数变量 
m=0; //m为退出人数 
s=0; //存被投入海者数组的下标 
sh=0; //存在船上人编号数组的下标 
while (m<15) 
{ 
if (num[i]!=0) k++; 
if (k==9) 
{ 
sea[s]=num[i]; 
s++; 
num[i]=0; 
k=0; 
m++; 
} 
i++; 
if (i==30) i=0; 
} 
for(i=0;i<30;i++) 
if (num[i]!=0) 
{ 
ship[sh]=num[i]; 
sh++; 
} 

cout<<"被投入海的序号为:"<<endl; 
for(i=0;i<15;i++) 
{ 
cout<<sea[i]<<" "; 
} 
cout<<endl<<"留在船上的序号为:"<<endl; 
for(i=0;i<15;i++) 
{ 
cout<<ship[i]<<" "; 
} 
cout<<endl; 
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -