黑马程序员技术交流社区

标题: 逻辑 [打印本页]

作者: 倉促、尋找你    时间: 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