PTA 5-28 猴子选大王

来源:互联网 发布:电子书什么软件好 编辑:程序博客网 时间:2024/05/22 12:10

一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?

输入格式:

输入在一行中给一个正整数N(1000)。

输出格式:

在一行中输出当选猴王的编号。

输入样例:

11

输出样例:

7
思想:使用循环链表建立约瑟夫环来实现,过程比较清晰。
#include <iostream>#include <cstdio>using namespace std;typedef struct node{    int num;    struct node *next;    node()//初始化    {        num=0;        next=NULL;    }}*Link;Link create(Link L,int n)//建表{    L=new node();    Link p,q;    p=L;    int i=1;    while(i<=n)    {        q=new node();        q->num=i;        p->next=q;        p=q;        i++;    }    p->next=L->next;//建立循环链表    return p;}void caculate(Link L,int n)//计算{    L=create(L,n);    Link p,q;    p=L->next;    int num=0,i=n;    while(p->next->num!=1)        p=p->next;    while(i>1)//一共删除掉n-1的元素,保留下一个用做输出    {        while(num<2)        {            num++;            p=p->next;        }        q=p->next;//指针保留        p->next=q->next;//删除出列的元素        num=0;        i--;        if(i==1)            break;    }    cout<<p->num;}int main(){    int n;    cin>>n;    Link L;    caculate(L,n);    return 0;}


0 0
原创粉丝点击