华为2014届机试题之约瑟夫环问题

来源:互联网 发布:身份证识别软件下载 编辑:程序博客网 时间:2024/06/15 14:29
package com.huawei.Joseph;import java.util.LinkedList;import java.util.Scanner;/** * 约瑟夫环问题: 1,2,...n编号的人顺时针围坐一圈,每人一个密码数n,给定一个起始整数m,从第一个人开始从1报数, * 到m时停止,该人出列,得到他的密码作为其实m,接着从下一个人开始从1重新报数,一次循环,直到所有人出列,按照出列顺序打印出出列人的编号 eg: 输入 6 * 3 6 5 4 3 2 1 ,空格分开的一组数字,第一个为n,第二个为m,以后的为n个人各自的密码 输出为 3 1 4 2 5 6 *  * @author patrick * @date 10/9 2013 *  */public class Joseph {public static void main(String[] args) {LinkedList<Integer> jlist = new LinkedList<Integer>();LinkedList<Integer> plist = new LinkedList<Integer>();Scanner in = new Scanner(System.in);String s = in.nextLine();if (!s.matches("[\\d+ ]*")) {System.err.println("input error !");return;}String nums[] = s.split(" ");int n = Integer.parseInt(nums[0]);// number of peopleint m = Integer.parseInt(nums[1]);// original secretif (n > 10 || m > 10) {System.err.println("are you cray?how dare you input so many numbers,it's no need but waste my time!");return;}if (nums.length < n + 2) {System.err.println("wrong input!,the number of people must match your input!");return;}for (int i = 0; i < n; i++) {jlist.add(Integer.parseInt(nums[i + 2]));plist.add(i + 1);}int circleCount = 0;StringBuilder sb = new StringBuilder();System.out.print("secret =");while (jlist.size() > 0) {for (int i = 0; i < jlist.size(); i++) {circleCount++;if (circleCount == m) {m = jlist.get(i);System.out.print(m + "\t");sb.append(plist.get(i)).append(" ");jlist.remove(i);plist.remove(i);i--;circleCount = 0;}}}System.out.println();System.out.println("positon =" + sb.toString());}}

原创粉丝点击