约瑟夫问题,怎么用C语言写???

2024-11-30 00:35:23
推荐回答(2个)
回答1:

#include
#include

typedef struct LNode
{
int number;
int password;
struct LNode *next;
}LNode,*LinkList;

void CreatLink(LinkList &tail,int n) //尾插法建立不带头结点单向循环链表,返回尾指针
{
LNode *head,*p;
for(int i=1;i<=n;i++) //依次输入n个人的密码,建立单向循环链表
{
p=(LNode*)malloc(sizeof(LNode));
p->number=i;
printf("请输入第%d个人的密码:",i);
scanf("%d",&(p->password));
if(i==1) //建立第一个结点
{
head=p; tail=p; tail->next=head;
} //第2-n个结点,插入表尾
tail->next=p; tail=p; tail->next=head;
}

/* p=head; //输出链表
while(p->next!=head)
{
printf("%d ",p->password);
p=p->next;
}
printf("%d ",p->password);*/

}

void joseph(LinkList &tail)
{

int m;
printf("\n请输入一个正整数作为初始报数上限值:");
scanf("%d",&m);
int i=1;
LNode *p=tail->next,*pre=tail;
printf("\n出圈顺序依次为:");
while(p->next!=p) //圈中多于1个人时
{
while(i {
pre=p; p=p->next; i++;
}
printf(" %d ",p->number); //报数为m的人数列
m=p->password;
pre->next=p->next;
free(p);
i=1; //从下一个人开始重新报数
p=pre->next;

}
printf(" %d \n",p->number); //最后一个人出列
free(p);

}

void main()
{

int n;
printf("\n请输入圈中人数:");
scanf("%d",&n);
LinkList tail;
CreatLink(tail,n);
joseph(tail);
}
额,不知道你看不看的懂

回答2:

24
1:0 2:0 3:0 4:0 5:1 6:1 7:1 8:1 9:1 10:0 11:0 12:1 13:0 14:0 15:0
16:1 17:0 18:1 19:1 20:0 21:0 22:1 23:1 24:1 25:0 26:1 27:1 28:0 29:0 30:1
(1为非教徒,0为教徒)
Press any key to continue

#include
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 5 23 11 29 17 10 2
28 25 1 4 15 13 14 3 20 21
Press any key to continue
*/