约瑟夫问题是怎么来的?有什么典故吗?

来源:百度知道 编辑:UC知道 时间:2024/05/10 01:15:34

跟八皇后问题一样,你说可能有八个皇后吗?这些都是想象出来的,给经典的算法套一个经典的背景,这样就不大会忘记,世界叫约瑟夫的人也不在少数吧

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

思路:模拟扔入海中的过程,然后把剩余的位置作为教徒的位置。

注意:以下代码中的分号均为全角字符,如果拷贝这段代码并且编译的话,必须把全角的分号更改为半角的分号(也就是在输入法为英文的时候直接在键盘上输入分号)。

#include<iostream>
using namespace std;

void main() {
int i, j, k = 1, a[31];
for(i = 0; i <= 30; i++) a[i] = 0;
for(i = 1; i <= 15; i++){
for(j = 1; j <= 9; j++, k++) while(a[k]) if(++k > 30) k = 1;
a[k-1] = 1;
}
printf("%d\n", k);
for(i = 1; i <= 30; i++) {
printf("%2d:%d ", i, a[i]);
if(!(i%15)) putchar('\n');
}
printf("(1为非教徒,0为教徒)\n");
}

/*
n, s, m = 30 1 9
出圈次序:
9 18 27 6 16 26 7 19 30 12
24 8 22