【c++】猴子选大王
一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(\le≤1000)。
输出格式:
在一行中输出当选猴王的编号。
样例输入:
11
样例输出:
7
程序代码:
#include<iostream> #include<malloc.h> using namespace std; struct node { int data; struct node* next; }; node* init(node* a,int n); int main() { int n; cin>>n; node* l=(node*)malloc(sizeof(node)); l=init(l,n); node* p =l; /*while(p->next!=l) { cout<<p->data; p=p->next; } cout<<p->data;*/ p=l; int count = 0; while(p->next!=p) { count++; if(count==2) { node* temp; temp = p->next; p->next=p->next->next; free(temp); count = 0; } p=p->next; } cout<<p->data; return 0; } node* init(node* a,int n) { a->next = NULL; a->data= 1; node* p=a; if(n==1) { a->next=a; return a;} int i = 2; node* s; while(i<=n) { s= (node*)malloc(sizeof(node)); s->data = i; s->next=NULL; p->next=s; p=p->next; i++; } s->next = a; return a; }
运行结果: