一群猴子要选新猴王。新猴王的选择方法是:让N只候选猴子围成一圈,从某位置起顺序编号为1~N号。从第1号开始报数,每轮从1报到3,凡报到3的猴子即退出圈子,接着又从紧邻的下一只猴子开始同样的报数。如此不断循环,最后剩下的一只猴子就选为猴王。请问是原来第几号猴子当选猴王?
输入格式:
输入在一行中给一个正整数N(≤1000)。
输出格式:
在一行中输出当选猴王的编号。
输入样例:
11
输出样例:
7
//链表解决,创建结构体数组
#include<iostream>
using namespace std;
struct monkey{
int num;
struct monkey *next;
};
int main(void){
int N;
cin>>N;
struct monkey mon[N];
int i;
for(i=0;i<N;i++){
mon[i].num=i+1;
if(i==N-1) mon[i].next=&mon[0];
else mon[i].next=&mon[i+1];
}
struct monkey *p;
for(p=mon,i=0;p->next!=p;p=p->next){
++i;
if((i+1)%3==0){
p->next=p->next->next;
i=0;
}
}
printf("%d",p->num);
return 0;
}
//约瑟夫环问题(数学解法)
#include<stdio.h>
int main()
{
int i,king,n;
king = 0;
scanf("%d",&n);
for(i=2;i<=n;i++){
king = (king+3)%i;
}
printf("%d",king+1);
return 0;
}
//利用vector解决
//转自https://www.cnblogs.com/Luckykid/p/10060455.html
#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
using namespace std;
int main(){
int n,num;
vector <int> vec;
scanf("%d",&n);
for(int i = 1;i <= n;i++){
vec.push_back(i);
}
num = 0;
while(vec.size() != 1){
for(int i = 0;i < vec.size();i++){
num++;
if(num == 3){
vec.erase(vec.begin() + i);
if(vec.begin() + i != vec.end())//如何删除的不是最后一个num = 1,否则为0
num = 1;
else
num = 0;
}
}
}
printf("%d\n",vec[0]);
return 0;
}