您的位置:首页 > 编程语言

(百例编程)71.约瑟夫问题

2012-06-10 16:17 337 查看
题目:这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。

//题目:这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:
//15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才
//能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,
//每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排
//法,才能使每次投入大海的都是非教徒。
//BY as1138 2011-10-22

#include <iostream>
#include <queue>
using namespace std;

int main(void)
{
queue<int> iqTe;
char chPai[30];
int i=0;
int tem;
while (i!=30)
iqTe.push(i++);

for (int j=0;j!=15;++j)
{
for (int n=0;n!=8;++n)
{
tem = iqTe.front();
iqTe.pop();
iqTe.push(tem);
}
tem = iqTe.front();
iqTe.pop();
chPai[tem] = '*';
}

i= 0;
while (i!=30)//输出结果中‘*’代表非教徒,‘@’代表教徒
{
if(chPai[i] != '*')
chPai[i] = '@';
cout<<chPai[i++]<<" ";
}
cout<<endl;
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: