n个人围成一圈,顺序编号。从第一个人开始从1到m报数,凡报到m的人退出圈子,编程求解最后留下的人的初始编号。
程序运行示例:
6 3(两个输入数据之间有空格)
1
#include<stdio.h>
#include<stdlib.h>
typedef struct NODE
{
int num;
struct NODE *next;
}node;
node *init(node *head,int n);
void goout(node *head,int m);
int main(){
int n,m;
node *head=NULL;
scanf("%d%d",&n,&m);
head=init(head,n);
goout(head,m);
}
node *init(node *head,int n){
node *p=NULL,*pr;
int i;
p=(node *)malloc(sizeof(node));
if(p==NULL)exit(0);
head=p;
pr=p;
p->num=1;
for(i=2;i<=n;i++){
p=(node *)malloc(sizeof(node));
if(p==NULL)exit(0);
p->num=i;
pr->next=p;
pr=p;
}
pr->next=head;//绕成一个圈!
return head;
}
void goout(node *head,int m){
node *p=head,*pr;
int i;
while(p->next!=p){ //当只剩下最后一个时,它自己的尾指向自己的头
for(i=1;i<m;i++){//例如,报3退出,则用pr存报2的,p指向报3的
pr=p;
p=p->next;
}
pr->next=p->next;//删除p节点
free(p);
p=pr->next;//p指向下一轮报1的
}
printf("%d\n",p->num);
}
呜呜,感觉自己好菜呀,没想出来,看了别人的,自己敲了一遍