约瑟夫问题;
15个教徒和15个非教徒遇到海难,必须投一半人下去,30人围成一圈,从第一个人开始报数,数到9扔到海里,求怎样排列使扔进海里的都是异教徒。
#include <stdio.h>
int main()
{
int i;
int j = 1; //第一个报数
int k;
int a[31] = {0};
for (i = 1; i <= 30; i++) //每个人的序列号大于15的是教徒,小于等于15的是非教徒
{
k = 1; //k是计数的值
while (k <= 9)
{
if (j > 30) //当j大于30时,由于围成圈,返回1
j = 1;
if (a[j]) //当a[j]不为空时,j自加一
j++;
else
{
if (k == 9) //当k等于9时,将排列到的人扔进海里
{
a[j] = i;
}
k++; //j,k都自加一
j++;
}
}
}
for (i = 1; i <= 30; i++) //当序列号大于15时,输出j,说明是教徒,小于等于15时输出f,说明是非教徒
{
printf("%c\t", a[i] > 15 ? 'j' : 'f');
}
printf("\n");
return 0;
}