找猴王:15只猴子围成一圈从1报数到7的出局,最后谁是猴王。

第一种:

package 找猴王;

public class Test {
	public static void main(String[] args) {
		int n=15;//15只猴子
		int m=7;//数到7的就出局
		int count=1;//count为计报数的值,从1开始,7结束
		int size=n;//size的值从15变到1,到1时就找到了猴王(每数到7的就出局所以会最终剩余1)

		int[] a = new int[n];//定义一个数组存放15个猴子的编号(1--15的编号)
		for(int i=0;i<n;++i)
		{
			a[i]=i+1;//第一只猴子编号1,第二只猴子编号2...第15只猴子编号15
			//System.out.println(a[i]+",");打印出1--15个数
		}
		int current=0;
		while(size!=1)//此while循环判断剩余猴子数,当剩余1只时结束,找到猴王
		{
			while(count<m)//从1开始报数直到报到7时结束此while循环
			{
				if(a[current]!=0)
				{
					count++;
					current=(current+1)%n;//循环成一个圈
					while(a[current]==0)
					{
						current=(current+1)%n;
					}
				}
				else
				{
					current=(current+1)%n;
					while(a[current]==0)
					{
						current=(current+1)%n;
					}
				}
			}

			a[current]=0;
			while(a[current]==0)
			{
				current=(current+1)%n;
			}

			size--;//上面找到了数7的就使猴子数size减一
			count=1;//count计数重新从1开始计数
		}
		//System.out.println();//换行
		for(int i=0;i<n;++i)//此for循环找出a[i]不等于0的猴子就是大王,因为a[i]是0表示淘汰了的
		{
			if(a[i]!=0)
			{
				System.out.println("第"+(i+1)+"个是猴王!");
			}
		}

	}

}

第二种:

package 找猴王;

public class Test2 {
    public static int getQue(int n,int m){
        int r = 0;
        for(int i=2;i<=n;i++)
            r = (r+m)%i;
        return r+1;
    }
    public static void main(String[] args) {
		int key = Test2.getQue(15,7);
		System.out.println("猴王是:"+key);
	}

}
时间: 2024-10-03 20:45:17

找猴王:15只猴子围成一圈从1报数到7的出局,最后谁是猴王。的相关文章

一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来!

package com.pb.demo1; import java.util.ArrayList; import java.util.List; import java.util.Scanner; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 一群人围成一圈从123报数,如果报到3就退出该圈中,直到最后一个人留下来! * 约瑟夫的游戏 */ public class Demo1 { public sta

C语言——N个人围成一圈报数淘汰问题

<一>问题描述: 有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止. 问此人原来的位置是多少号? <二>问题解决: 1.定义数组记录每个编号的状态(是否被淘汰): 2.在未被淘汰的人中检查是否数到3,若是,淘汰此人: 3.继续此过程至所有人被淘汰: <三>示例代码: 1 /* 2 16.有17个人围成一圈(编号为0-16),从第 0号的人开始从 1报数, 3 凡报到 3的倍数的人离

java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。

1 /*37 [程序 37 报数] 2 题目:有 n 个人围成一圈,顺序排号.从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位. 4 */ 5 6 /*分析1====错误分析,没有注意到要退出圈子!!! 7 * 1.用一个数组存放n个1,从头开始报数 8 * 2.声明一个计数器,报数为3时,数组中的数赋为0,计数器重置 9 * 3.一直直到还剩下最后一个不为0的数,这个数的角标加1就是原来的几号 10 * 11 * 分析2:----利用A

10.5 有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

有n人围成一圈,顺序排号.从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位. #include <stdio.h> int main(){ int num[50]; int * p,n,i; p=num; printf("输入人的数目n="); scanf("%d",&n); //为每人赋初始的序号 for(i=0; i<n; i++){ *(p+i)=i+1; } int m=0,j=0,k=0;

有17个人围成一圈(编号为0~16),从第 0号的人开始从 1报数, 凡报到 3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止。 问此人原来的位置是多少号?

void main() { int a[17] = { 0 };//代表17个人,值为0代表还在,1代表离开 int baoshu = 1;//当前报数的数字,最多49 int total = 17;//当前还剩多少人在 int cur = 0;//17个人的当前人循环到的编号 while (total!=1) { if (cur == 17)//说明已经走到下一圈了,需要保证当前人的编号 { cur = 0; } if (a[cur] == 1)//说明该人已经离开圈子,报数不增加,走向下一人

5、题目:有n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来第几号的那位。 思路:n长度的数组,boolean类型。出圈置为false,当最后只有一个true的时候,就是留下来的人。

public class Test { public static void main(String[] args) { Scanner sc = new Scanner(System.in); System.out.println("请输入人的个数n:"); int n = sc.nextInt(); fun(n); sc.close(); } private static void fun(int n) { boolean[] ps = new boolean[n]; int co

有n人围成一圈,顺序排号。从第1个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下的是原来的第几号的那位。

#include <iostream> using namespace std; int main() { int i,j,n,m,k,*p,num[100];k=m=0;   cin>>n;      p=num;      for(i=0;i<n;i++)          *(p+i)=i+1;      i=0;      while(m<n-1)      { if(*(p+i)!=0)            k++;         if(k==3)    

【转】约瑟夫环算法---------题目:有n个人围成一圈,顺序排号,从第一个开始报数(从1到3报数),凡报到3的人退出圈子,问最后最后留下的是原来第几号的那位.

提示:用环形链表实现 对于这个题目其实就是用c语言的循环链表实现一个约瑟夫环.我们可以定义一个循环链表,将这n个人加入到链表中,然后定义三个节点指针在链表上循环,移动跨度为3,利用链表的循环功能每次删除第三个节点,这边要注意的一个问题就是你定义的是3个指针,且在循环中他们彼此也都是有 ->next关系,一般我们判断循环结束条件时都是一个节点的下一个节点是否为它本身(如ptr->next == ptr),这里我们要注意循环体中链接方向否则很可能出现无用指针导致错误,因为最后我们要剩下一个节点那么

有17个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,问最后留下&#160;的是原来第几号的那位

int n = 17;  boolean[] persons = new boolean[n];  //初始化  for(int i=0;i<persons.length;i++){   persons[i] = true;  }    int len = persons.length;//剩下的人数  int count = 0;  while(len>1){   //继续报数   for(int i=0;i<persons.length;i++){    if(persons[i])