约瑟夫问题求指教
写了个解约瑟夫问题的小程序,但不知为什么求不出16、31的解(41人环、3人计数),最怪的是如果总人数能被计数人数整除就会出现无法求解的问题。小弟最近自学C,技术很菜,找了很久也没发现问题处在哪里,求各位指教!小弟最近自学C,技术很菜,求各位多多指教!
代码如下:
#include <stdio.h>c 约瑟夫问题 循环链表
#define Max 100
struct person {
int place;
struct person *next;
}Jawsuicide[Max];
int surv_list[Max] = {0};
int gen_cycle(int total);
int suicide(int total, int unit_num);
int survivor(int alive);
int main()
{
int total, unit_num;
printf("How many Jaws are there(less than %d):\n", Max);
scanf("%d", &total);
printf("How many people count after one suicide:\n");
scanf("%d", &unit_num);
gen_cycle(total);
printf("Now Jaws begin to suicide !\n");
suicide(total,unit_num);
survivor(total);
return 0;
}
int gen_cycle(int total)
{
int i;
for(i = 0; i < total; i++)
{
Jawsuicide[i].place = i + 1;
Jawsuicide[i].next = &Jawsuicide[i+1];
}
Jawsuicide[total-1].next = &Jawsuicide[0];
for(i = 0; i < total; i++)
{
surv_list[i+1] = 1;
}
return 0;
}
int suicide(int total, int unit_num)
{
int i = 1;
struct person *j = &Jawsuicide[0];
int alive;
alive =total;
while(1)
{
if(alive >= unit_num)
{
if(i != unit_num)
{
j = (*j).next;
i++;
}
else
{
surv_list[(*j).place] = 0;
printf("No.%d killed himself!\n", (*j).place);
alive -= 1;
j = (*j).next;
i = 1;
}
}
else
break;
}
printf("There are %d Jaw alive.\n", alive);
return 0;
}
int survivor(int total)
{
int i;
printf("The survivor is:\n" );
for(i = 1; i <= total; i++)
{
if(surv_list[i] == 1)
printf("No.%d\n", i);
}
return 0;
}
#include <stdio.h>
#define Max 100
struct person {
int place;
struct person *next;
}Jawsuicide[Max];
int surv_list[Max] = {0};
int gen_cycle(int total);
int suicide(int total, int unit_num);
int survivor(int alive);
int main()
{
int total, unit_num;
printf("How many Jaws are there(less than %d):\n", Max);
scanf("%d", &total);
printf("How many people count after one suicide:\n");
scanf("%d", &unit_num);
gen_cycle(total);
printf("Now Jaws begin to suicide !\n");
suicide(total,unit_num);
survivor(total);
return 0;
}
int gen_cycle(int total)
{
int i;
for(i = 0; i < total; i++)
{
Jawsuicide[i].place = i ;
Jawsuicide[i].next = &Jawsuicide[i+1];
}
Jawsuicide[total-1].next = &Jawsuicide[0];
for(i = 0; i < total; i++)
{
surv_list[i] = 1;
}
return 0;
}
int suicide(int total, int unit_num)
{
int i = 0;
struct person *j = &Jawsuicide[0];
int alive;
alive =total;
while(alive >= unit_num)
{
if(surv_list[j->place]!=0)
{
i++;
if(i==3)
{
surv_list[j->place]=0;
i=0;
printf("%d is killed \n",j->place+1);
alive--;
}
}
j=j->next;
}
printf("There are %d Jaw alive.\n", alive);
return 0;
}
int survivor(int total)
{
int i;
printf("The survivor is:\n" );
for(i = 0; i < total; i++)
{
if(surv_list[i] == 1)
printf("No.%d\n", i+1);
}
return 0;
}
//假设有n个人团团围做,从第1个人开始数数,数到第m个人时候,第m个人出列,
//然后继续从1开始数数,数到第m个人退出
#include <stdio.h>
#include <conio.h>
int i,k,t;
int n,m;
static char f[1001];//0该座位未出圈,1该座位已出圈
void main() {
while (1) {
printf("Input n m(1000>=n>=m>=1):");
fflush(stdout);
rewind(stdin);
if (2==scanf("%d%d",&n,&m)) {
if (1000>=n && n>=m && m>=1) break;
}
}
t=0;//已出圈总人数
i=1;//座位编号
k=1;//当前要数的数
while (1) {
if (0==f[i]) {
if (m==k) {
t++;
f[i]=1;
printf("%3d ",i);
if (0==t%10) printf("\n");
if (t>=n) break;
}
k++;if (k>m) k=1;
}
i++;if (i>n) i=1;
}
cprintf("Press any key ...");
getch();
}