加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

java-围圈报数问题

(2015-06-05 00:34:45)
标签:

it

算法

分类: technology

有M个人围成一圈从1开始报数,当报到N或N的倍数的时候,则必须出列,问最后剩余的一个人是谁,他原来的位置是多少?

package test;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.Vector;

public class Circle {

 public static void main(String[] args) {
  boolean flag = true;
  while (flag) {
   System.out.println("请输入一共有多少人排队:");
   InputStream input = System.in;
   InputStreamReader reader = new InputStreamReader(input);
   BufferedReader buffer = new BufferedReader(reader);
   try {
    String str = buffer.readLine();
    int num = Integer.valueOf(str);
    System.out.println("请输入报到几的倍数的时候开始出列:");
    str = buffer.readLine();
    int index = Integer.valueOf(str);
    flag = false;
    getCircle(num,index);
   } catch (NumberFormatException e) {
    System.out.println("对不起,您输入的不是数字,请重新输入:");
   } catch (IOException e) {
    System.out.println("对不起,您的输入有误,请重新输入:");
   }
  }
 }

 
 public static void getCircle(int elementCount,int number) {
  // flag 用来控制是否还报数,当人数为1时,停止报数
  boolean flag = true;
  // currentNum表示目前数到的数目,从1开始数,每一圈的第一个人会接着上一圈的最后一个人数
  int currentNum = 0;

  // 记录本圈报数过程中移除的人的数目
  int count = 0;
  // currentCount 表示本圈数到的数目,从1开始,数完一圈后此数目为清零
  int currentCount = 0;

  // currentListSize 表示本圈开始的时候一共还剩下多少个人
  int currentListSize = 0;

  // list 用以表示围成的圈
  // listPosition 用来最后剩余元素所在的位置
  Vector list = new Vector();
  Vector listPosition = new Vector();

  // 将元素按顺序装配到list和listPosition里面
  for (int i = 1; i <= elementCount; i++) {
   list.add("people" + i);
   listPosition.add("people" + i);
  }
  while (flag) {
   // 得到本次数数的时候本圈一共还有多少人
   currentListSize = list.size();
   if (currentListSize != 1) {
    // for循环表示一圈的报数过程,当人数的数量为1时将不再报数

    // 一圈报数开始前,将记录本圈报数过程的人数计数器清零
    currentCount = 0;

    // 将记录本圈移除人数的计数器清零
    count = 0;
    for (int j = 0; j < currentListSize; j++) {
     // 开始报数
     currentNum++;
     System.out.println("现在开始报数为:" + currentNum);
     // 记录本圈报数的人数
     currentCount++;
     // 判断该人目前所报的数是否能被3整除,如果条件成立则移除该人
     if (currentNum % number == 0) {
      System.out.println("本次移除的人为:"
        + list.get(currentCount - count - 1));
      list.remove(currentCount - count - 1);
      count++;
     }

    }
   } else {
    flag = false;
    System.out.println("最后剩余的人为:" + list.get(0));
    System.out.println("最后剩余的人的原来的位置为:"
      + listPosition.indexOf(list.get(0)));
   }
  }

 }
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有