[D-OJ练习] 约瑟夫环问题
作者:互联网
设有编号为1,2,…,n的n个人围成一个圈,给定一个密码m,从第一个人开始报数,报到m是停止报数,报m的人出圈,再从他的下一个起重新报数,报到m时停止报数,报m的出圈,…,如下下去,直到所有人全部出圈为止。键盘输入n和m的值,请设计程序输出n个人出圈的次序。
输入描述
输入初始圈中的人数n,占一行 输入密码m,占一行
输出描述
输出出圈的n个人的次序,以空格隔开,最后一个元素后有空格
输入样例
10 3
输出样例
3 6 9 2 7 1 8 5 10 4
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
typedef struct person{
int num;
struct person* next;
}P;
int main()
{
int n,m;
scanf("%d%d",&n,&m);
P* ph=(P*)malloc(sizeof(P));
ph->next = NULL;
P* a = ph;
for(int i=0; i<n; i++)
{
P* p=(P*)malloc(sizeof(P));
p->num = i+1;
a->next = p;
a = p;
if(i!=n-1)
{
p->next = NULL;
} else{
p->next = ph->next;
}
}
a = ph->next;
int N=n, M=m,i=0;
P* pre = NULL;
while(N--)
{
if(M==1){
M=m;
}
while(M != 1){
pre = a;
a = a->next;
M--;
}
printf("%d ",a->num);
a = a->next;
pre->next = a;
}
return 0;
}
标签:pre,出圈,OJ,int,练习,next,ph,约瑟夫,报数 来源: https://blog.csdn.net/qq_39391544/article/details/120445863