17世纪的法国数学家加斯帕在《数目的游戏问题》中讲了这样一个故事:15个教徒和15 个非教徒在深海上遇险,
必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,
每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
必须将一半的人投入海中,其余的人才能幸免于难,于是想了一个办法:30个人围成一圆圈,从第一个人开始依次报数,
每数到第九个人就将他扔入大海,如此循环进行直到仅余15个人为止。问怎样排法,才能使每次投入大海的都是非教徒。
实现代码:
#include <stdio.h>
#include <malloc.h>
typedef struct Huan
{
int a;
struct Huan * next;
}H;
H * creat(int n)
{
H * p , * q , * head;
head = (H *)malloc(sizeof(H));
p = head;
int i = 1;
if( 0 != n )
{
while( i <= n )
{
q = (H *)malloc(sizeof(H));
q->a = i ++;
p->next = q;
p = q;
}
q->next = head->next;
}
free(head);
return q->next;
}
int main()
{
H * p , * temp ;
p = creat(30);
while( p != p->next )
{
for(int i=0;i<8;i++)
{
p = p->next;
}
printf("%d-->",p->next->a);
temp = p->next;
p->next = temp->next;
free(temp);
p = p->next;
}
printf("%d",p->a);
return 0;
}
由代码可得:
10-->20-->30-->11-->22-->3-->15-->27-->9-->24-->7-->23-->8-->26-->14-->2-->21
-->16-->6-->4-->1-->5-->13-->19-->12-->29-->18-->25-->17-->28
由上述可知:
将教徒放在2-->21-->16-->6-->4-->1-->5-->13-->19-->12-->29-->18-->25-->17-->28位置上,可以保证每次投入大海的都是非教徒。