java解答:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java解答:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?相关的知识,希望对你有一定的参考价值。
package ttt; import java.util.HashMap; import java.util.Map.Entry; /** * 有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去, * 直到最后只剩下一个人为止,问此人原来的位置是多少号? * */ public class n人报数m时离开 { public static void main(String[] args) { HashMap<Integer, Integer> theQuee = new HashMap<Integer,Integer>(); for (int i = 0; i < 17; i++) { theQuee.put(i, i+1);//编号,固定位置 } HashMap<Integer, Integer> itretMap = itretMap(theQuee,theQuee.size()); for (Entry<Integer,Integer> entry : itretMap.entrySet()) { if(entry.getValue()!= 0){ System.out.println("结果:"+entry.getKey()); } } } //遍历Map并给非3的倍数的Key的value+1 public static HashMap<Integer, Integer> itretMap(HashMap<Integer,Integer> map,int lenth){ int sum = 0; for (Entry<Integer,Integer> entry : map.entrySet()) { int value = entry.getValue(); if(value%3 != 0){//不可以整除 entry.setValue(value+lenth);//加 sum++;//进入下一轮 }else{ if(0!=entry.getValue()){//避免重复淘汰 entry.setValue(0);//淘汰 lenth --;//参与者-1 } } } if(sum>1){// System.out.println("还要继续,还有:"+sum); return itretMap(map,sum); }else{//已决出胜出者 return map;//返回map } } }
加班回来的路上看到一个这样的题,题目就是标题,
(原题地址:http://www.cnblogs.com/tonybinlj/archive/2009/01/04/1367856.html),然后自我感觉用了个比较拙劣的方式,最后还是实现了。这里的17和3当然可以当做参数m,n来处理。。
弄完网上找了找。C系列实现形式思路基本上是一样的。
以上是关于java解答:有17个人围成一圈(编号0~16),从第0号的人开始从1报数,凡报到3的倍数的人离开圈子,然后再数下去,直到最后只剩下一个人为止,问此人原来的位置是多少号?的主要内容,如果未能解决你的问题,请参考以下文章
有n个石子围成一圈,每个石子都有一个权值a[i],你需要取一些石子,
c语言,有n个人围成一个圈,顺序排号,从第一个开始报数(1到3),凡报到3的退出圈子问最后留下的人
java例题_37 有 n 个人围成一圈,顺序排号。从第一个人开始报数(从 1 到 3 报数),凡报到 3 的人退出圈子, 3 问最后留下的是原来第几号的那位。
C语言 n个人围成一圈,顺序排号。从第一个人开始报数(从1到3报数),凡报到3的人退出圈子,计算最后留下的是最初第几号人