7-50 猴子选大王(20 分)

来源:互联网 发布:mac win系统截图快捷键 编辑:程序博客网 时间:2024/05/17 08:00

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

输入格式:

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

输出格式:

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

输入样例:

11

输出样例:

7

我的代码:

(编译语言:C++。方法一:vector动态数组模拟)

#include<iostream>#include<vector>using namespace std;int main(){int n,i;cin>>n;vector<int>v;vector<int>::iterator it;for(i=1;i<=n;i++) v.push_back(i);it=v.begin();while(v.size()>1){for(i=1;i<3;i++){it++;if(it==v.end()) it=v.begin();}it=v.erase(it);if(it==v.end()) it=v.begin();}cout<<*it<<endl;return 0;}

提交结果:



我的代码:

(编译语言:C语言。方法二:数学方法解决约瑟夫问题)

#include<stdio.h>int main(){int n,i,sum=0;scanf("%d",&n);for(i=2;i<=n;i++) sum=(sum+3)%i;printf("%d",sum+1);return 0;}

提交结果:



我的代码:

(编译语言:Java。方法三:整数数组模拟)

import java.util.Scanner;public class Main{public static void main(String[] args) {int n,m,i,j=0,vis[]=new int[1001];Scanner In=new Scanner(System.in);n=In.nextInt();m=n;for(i=1;i<=n;i++){if(vis[i]==0){if(m==1) break;j++;if(j==3){j=0;vis[i]=1;m--;}}if(i==n) i=0;}System.out.printf("%d\n",i);}}

提交结果: