约瑟夫问题
这是17世纪的法国数学家加斯帕在《数目的游戏问题》中讲的一个故事:
15个教徒和15 个非教徒在深海上遇险,必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:
30个人围成一圆圈,从第一个人开始依次报数,每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。
问怎样排法,才能使每次投入大海的都是非教徒。
代码实现:
#include<iostream>
using namespace std;
void Yueshefu(int a[], int Num, int k) //Num为数组元素个数,k为每次查找的间隔数
{
int i = 0;
int j = 0;
int n = 0; //计数
for(i = 0; i < Num; i++)
{
if (1 == a[i])
{
j += 1;
if (j == k)
{
a[i] = 0;
cout<<i+1<<" ";
j = 0;
n++;
}
if(n == 15) //查找15次就结束查找,跳出循环
{
break;
}
if (i == (Num-1))
{
i = -1;
}
}
}
}
int main()
{
int a[30] = {0};
int i = 0, j = 0;
for (i = 0; i < 30; i++)
{
a[i] = 1;
}
cout<<"将非教徒安排在下列位置:"<<endl;
Yueshefu(a, 30, 9);
return 0;
}