黑马程序员技术交流社区
标题: 逻辑 [打印本页]
作者: 倉促、尋找你 时间: 2014-1-17 20:23
标题: 逻辑
有100个人围成一个圈,从1开始报数,报到14的这个人就要退出。然后其他人重新开始,从1报数,到14退出。问:最后剩下的是100人中的第几个人?
求代码实现
作者: wodenhaowzg 时间: 2014-1-17 20:28
package com.itheima;
import java.util.Arrays;
import java.util.Scanner;
public class Test10 {
/**
* 10、 有100个人围成一个圈,从1开始报数, 报到14的这个人就要退出。 然后其他人重新开始,
* 从1报数,到14退出。问:最后剩下的是100人中的第几个人?
*/
private static int count = 0;// 定义出局的编号,默认从0开始
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);// 键盘录入
System.out.println("请输入人数:");
int totalPerson = scanner.nextInt();// 总人数
System.out.println("请输入第几个人要退出:");
int outNum = scanner.nextInt();// 第几个人要退出。
judgePerson(totalPerson, outNum);// 调用判断人数的方法
}
/**
* 对人数进行判断
*
* @param totalPerson
* @param outNum
*/
private static void judgePerson(int totalPerson, int outNum) {
if (totalPerson == 1) {// 如果总人数是1,退出的就是这个人。
System.out.println("最后剩下的人为" + totalPerson + "个");
} else {// 否则调用退出的方法
personExit(totalPerson, outNum);
}
}
/**
* 退出方法
*
* @param totalPerson
* 总人数
* @param outNum
* 第几个人要退出
*/
private static void personExit(int totalPerson, int outNum) {
int[] arr = new int[totalPerson];// 实例一个数组,长度为总人数
for (int j = 0; j < totalPerson; j++) {// 循环遍历
for (int i = 0; i < outNum; i++) {
count++;// 每数一个人,则编号加1
if (j > 0) {// 这里j>0可以不用判断,因为上面已经判断过了。
measure(j, arr);// 调用判断count是否存在的方法
}
if (count > totalPerson) {
count = 1;// 若count大于总人重新赋值为1
measure(j, arr);// 调用判断count是否存在的方法。
}
}
arr[j] = count;// 将退出的人保存到数组中.
}
System.out.println("退出的顺序为:" + Arrays.toString(arr));
System.out.println("最后剩下的人为:" + arr[totalPerson - 1]);// 最后剩下的人
}
/**
* 判断count是不是存在
*
* @param n
* @param arr
*/
private static void measure(int n, int[] arr) {
// 双重循环判断,因为要保证count的唯一。
for (int s = 0; s < n; s++) {
for (int w = 0; w < n; w++) {
if (count == arr[w])
count++;// 若存在则加1.
}
}
}
}
呵呵 楼主借鉴一下吧
作者: 月生春 时间: 2014-1-17 21:26
这样应该简单一点,一看这个问题用递归是最好的
/**
功能说明:1、 有100个人围成一圈,顺序排号。从第一个人开始报数(从1到14报数),凡报到14的人退出圈
* 问最后留下的是原来第几号的那位。
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner input = new Scanner(System.in);
System.out.print("请输入总人数:");
int p = input.nextInt();
/** *//**** 初始化人员 ***/
boolean[] per = new boolean[p];// boolean数组表示站成一圈的人,false表示退出
for (int i = 0; i < per.length; i++) {
per[i] = true;
}
/** *//**** 报号 ***/
int t = 0, len = per.length;
while (len > 1) {
for (int i = 0; i < per.length; i++) {
if (per[i]) {
t++;
if (t == 14) {
t = 0;
per[i] = false;
len--;
}
}
}
}
/** *//***** 结果 *****/
System.out.println("最后的情况:" + Arrays.toString(per));
for (int i = 0; i < per.length; i++) {
if (per[i]) {
System.out.println("原来喊的数:" + (i + 1) % 14);
}
}
}
}
作者: wodenhaowzg 时间: 2014-1-17 21:29
好吧。。在哪找的简化版 哈哈
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |