📄
字号:
问题的提出: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 + -