Java算法--逢质数出圈问题

import java.util.HashMap;
import java.util.Map;

/**
 * 转圈问题
 * 描述:n个人围成一个圈。从第一个人开始数数,1,2,3...当数到第一个大于n的质数的时候。
 * 此人将跳出数数,不再参与接下来的数数。一直数在最后一个人,求最后一个出圈人是第几个人。
 * @author clay,吴浩宇
 * 2019.10.12
 */
public class Test {
	
	public static void main(String[] args) {
		
		int lastNum = TurnAround(6 , 2);
		System.out.println(lastNum);
		
	}
	
	//判断质数方法
	static boolean prime_Number(int naturalNumber) {
		for (int i = 2; i<=(naturalNumber/2); i++) {
			if(naturalNumber%i == 0) {
				return false;
			}
		}
		return true;
	}
	
	
	//出圈
	//Pnum为参与人数。firstPrime为规定的最小数。
	public static int TurnAround(int Pnum, int firstPrime) {
		
		int fetch = 1;//计数君
		int lastPeople = 0;//最后一个出圈人
		
		//填充map。表示数圈的人
		Map map = new HashMap();
		for(int i = 0; i < Pnum; i++) {
			map.put(i+1 , 0);
		}
		
		int primeNum = 0;//质数个数最后应该小于等于Pnum - 1
		
		for(int i = 1; i <= Pnum; i++) {
//			System.out.println("循环数:"+fetch);
			
			if(map.get(i) == 0) {//该数在圈内
				
				if(fetch > firstPrime && prime_Number(fetch) == true ) {//判断是否在圈内并且质数大于规定的数
					map.put(i, 1);
					primeNum++;
					System.out.println("zhi数个数:"+primeNum + " " + i);
				}
				
				System.out.println("fetch:" + fetch + " i :" + i);
				fetch++;
			}				
			//判断圈内是否还有人,通过质数的个数来判断。
			if(primeNum == Pnum) {
				lastPeople = i;
				break;
			}
			
			//连接首尾
			if(i == Pnum)
				i = 0;//注意for循环中的i++,在这里耗费了一个小时!
			
		}
		
		return lastPeople;
	}
}

你可能感兴趣的:(java基础算法问题)