约瑟夫问题 c语言

2025-01-08 02:54:50
推荐回答(3个)
回答1:

"*"表示当前数起位置

#include
int main()
{
int n;
int i, j;
int pos[30];
for(i = 0; i < 30; i++) pos[i] = i+1; //位置输入到数组
i = 0;
n = 30;
while(n > 15){
i += 8;
i %= n;
printf("扔下第 %d 人\n", pos[i]);
n --;
for(j = i; j < n; j++){
pos[j] = pos[j+1];
}
printf("剩下的人: ");
for(j=0;j if(j == i) printf("*%d ", pos[j]);
else printf("%d ", pos[j]);
}
printf("\n");

}
return 0;
}

输出:
扔下第 9 人
剩下的人: 1 2 3 4 5 6 7 8 *10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
扔下第 18 人
剩下的人: 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 *19 20 21 22 23 24 25 26 27 28 29 30
扔下第 27 人
剩下的人: 1 2 3 4 5 6 7 8 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 *28 29 30
扔下第 6 人
剩下的人: 1 2 3 4 5 *7 8 10 11 12 13 14 15 16 17 19 20 21 22 23 24 25 26 28 29 30
扔下第 16 人
剩下的人: 1 2 3 4 5 7 8 10 11 12 13 14 15 *17 19 20 21 22 23 24 25 26 28 29 30
扔下第 26 人
剩下的人: 1 2 3 4 5 7 8 10 11 12 13 14 15 17 19 20 21 22 23 24 25 *28 29 30
扔下第 7 人
剩下的人: 1 2 3 4 5 *8 10 11 12 13 14 15 17 19 20 21 22 23 24 25 28 29 30
扔下第 19 人
剩下的人: 1 2 3 4 5 8 10 11 12 13 14 15 17 *20 21 22 23 24 25 28 29 30
扔下第 30 人
剩下的人: 1 2 3 4 5 8 10 11 12 13 14 15 17 20 21 22 23 24 25 28 29
扔下第 12 人
剩下的人: 1 2 3 4 5 8 10 11 *13 14 15 17 20 21 22 23 24 25 28 29
扔下第 24 人
剩下的人: 1 2 3 4 5 8 10 11 13 14 15 17 20 21 22 23 *25 28 29
扔下第 8 人
剩下的人: 1 2 3 4 5 *10 11 13 14 15 17 20 21 22 23 25 28 29
扔下第 22 人
剩下的人: 1 2 3 4 5 10 11 13 14 15 17 20 21 *23 25 28 29
扔下第 5 人
剩下的人: 1 2 3 4 *10 11 13 14 15 17 20 21 23 25 28 29
扔下第 23 人
剩下的人: 1 2 3 4 10 11 13 14 15 17 20 21 *25 28 29

回答2:

#include
#include
void main()
{
int a[30],b[15];
int i=0,j=0,k=0,n=30;
for(i=0;i<30;i++)
{
a[i]=1;
}
for(i=0;i<15;i++)
{
b[i]=0;
}
for(j=0;;j++)
{
for(i=0;i<30;i++)
{
if(a[i]!=0&&(i+1+30*j)%9==0)
{
a[i]=0;
n--;
b[k]=i+1;
k++;
}
if(n==15)
break;
}
if(n==15)
break;
}
printf("被扔下去的乘客的位置号为:\n");
for(i=0;i<15;i++)
{
printf("%d\n",b[i]);
}
}

我也是初学者,虽然做出来了,不过很浪费内存,运行时要等上好几秒,谢谢采纳

回答3:

算法很简单的