Fork me on GitHub

【算法】1、约瑟夫环

 

有n 个人围城一圈每次从1数起数到3就把那个人提出圈子,最后只保留一个人。

输入: 输入人数字符串
输出:把最后一个人所保留位置返回出来。
比如你输入11 的话即有11个人 [1,2,3,4,5,6,7,8,9,10,11] 。返回的是7

 

解题:

 

package sj1;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 *
 * @author Administrator
 *  剔出某数字
 */
public class sjt1_2 {
     
    int number; //总数
    int m;//要被剔除的数字
 
    /**
     * 剔除方法
     * @param number 总数
     * @param m 数数剔除的数字,比如3
     */
    public static void delete(int number, int m) {
        List<Integer> ins = new ArrayList<Integer>();
         
        /* 塞数字 */
        for (int i = 1; i < number+1; i++) {
            ins.add(i);
        }
        
        System.out.println("构造了原始值:" + ins);
 
        int index = 0;// 被T的人在列表中下标
        m = m-1;//减一算出下标
        for (int i = 0; i < number; i++) {
            //最后一个跳出
            if(ins.size() ==1 ){
                break;
            }
            // 从0开始数数
            index = (index + m) % ins.size();//核心算法
            System.out.println(index);
            System.out.println("第 ["+(i+1)+"] 次剔除了" + ins.get(index));
            ins.remove(index);
            System.out.println("还剩下:" + ins);
        }
         
    }
 
    public static void main(String args[]) {
        delete(11, 3);
    }

 

posted @ 2014-06-10 10:32  _落雨  阅读(232)  评论(0编辑  收藏  举报