猴子选大王

题目描述:n只猴子要选大王,选举方法如下:所有猴子按 1,2 ……… n 编号并按照顺序围成一圈,从第 k 个猴子起,由1开始报数,报到m时,该猴子就跳出圈外,下一只猴子再次由1开始报数,如此循环,直到圈内剩下一只猴子时,这只猴子就是大王。

解题思路:

1,建立循环链表并初始化。

2,使用一个计数器counter只要counter能整除m,就从链表上删除此节点,直到只剩一个节点即为所求。


#include <iostream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
struct node
{
 int date;
 struct node *next;
};
int main()
{
    int n,i,d;
    struct node * p1,*p2,*head;
    cin>>n;
    if(n==1)
        {
                cout<<n;
                return 1;
        }
    else
    {
                p1=(struct node*) malloc(sizeof(struct node));
                head=p1;
                p1->date=1;
        for(i=2;i<=n;i++)
              {
                      p2=(struct node*) malloc(sizeof(struct node));
                      p2->date=i;
                      p1->next=p2;
                      p1=p2;
              }
              p1->next=head;
              p1=head;
              cin>>d;
      while(p1->next!=p1&&p2->next!=p2)
      {
           for(i=1;;i++)
           {
                   if(i%d==0)
                   {
                        p2->next=p1->next;
                        p1=p2->next;
                        break;
                   }
                   p1=p1->next;
                   p2=p2->next;
           }


      }
      cout<<p2->date;
    }
      return 0;
}






你可能感兴趣的:(猴子选大王)