C语言实验题——约瑟夫问题
发布网友
发布时间:2022-05-13 15:37
我来回答
共2个回答
热心网友
时间:2023-10-14 17:36
这个是用循环链表作的,已经很简单了:)
#include <conio.h>
#include <stdio.h>
#include <malloc.h>
typedef struct num
{
int data;
struct num *next;
}node;
int main()
{
node *p1,*p2,*head;
int i,m,n,count=1;
scanf("%d %d",&n,&m);
head=p1=(node*)malloc(sizeof(node));
for(i=0;i<n;i++)
{
p2=(node*)malloc(sizeof(node));
p2->data=i+1;
p1->next=p2;
p1=p2;
}
p1->next=head->next;
free(head);
p1=p1->next;
while(p1!=p1->next)
if(count==m)
{
p2=p1->next;
p1->data=p2->data;
p1->next=p2->next;
free(p2);
count=1;
}
else
{
p1=p1->next;
count++;
}
printf("%d",p1->data);
getch();
return 0;
}
热心网友
时间:2023-10-14 17:36
我们有这个实验耶!
老师的:#include<stdio.h>
#define M 10
#define N 3
void main(void)
{
int a[M], b[M]; /*数组a存放圈中人的编号,数组b存放出圈人的编号*/
int i, j, k;
for(i = 0; i < M; i++) /*对圈中人按顺序编号1—M*/
a[i] = i + 1;
for(i = M, j = 0; i > 1; i--){
/*i表示圈中人个数,初始为M个,剩1个人时结束循环;j表示当前报数人的位置*/
for(k = 1; k <= N; k++) /*1至N报数*/
if(++j > i - 1) j = 0;/*最后一个人报数后第一个人接着报,形成一个圈*/
b[M-i] = j? a[j-1] : a[j+1] ; /*将报数为N的人的编号存入数组b*/
if(j)
for(k = --j; k < i; k++) /*压缩数组a,使报数为N的人出圈*/
a[k] = a[k+1] ;
}
for(i = 0;i < M – 1; i++) /*按次序输出出圈人的编号*/
printf(“%6d”, b[i]);
printf(“%6d\n”, a[0]); /*输出圈中最后一个人的编号*/
}
我的:
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
struct number{
int num;
struct number *next;
};
struct number * create(int n); /*创建循环列表*/
int n,k,l;
struct number *head,*p1,*p2;
void main (void)
{
printf("number you want \n");
scanf("%d",&n);
printf("number to choose\n");
scanf("%d",&l);
k = 1;
p1 = create(n);
while (n != 0)
{
if(!(k % l))
{
printf("%d\n",p1->num);
p2->next = p1->next;
n--;
}
p2 = p1;
p1 = p1->next;
k++;
}
getch();
}
struct number *create(int n)
{
int i;
p1 = (struct number *)malloc(sizeof(struct number) );
head = p1;
for(i = 1; i < n; i++)
{
p1->num = i;
p2 = p1;
p1 = (struct number *)malloc(sizeof(struct number) );
p2->next = p1;
}
p1->num = n;
p1->next = head;
return head;
}