约瑟夫问题

 题目是:

        17个人为成圈,依次编号为0-16,从第一号开始报数,报到3的倍数的人离开, 一直数下去,直到最后只剩1人,求此人的编号

 

我用java实现了一下,不知道还有没有更好的办法?

   先建立一个Reader类

  1. public  class Reader{
  2.     private Integer person;
  3.     private Integer num;
  4.     public Integer getPerson() {
  5.         return person;
  6.     }
  7.     public void setPerson(Integer person) {
  8.         this.person = person;
  9.     }
  10.     public Integer getNum() {
  11.         return num;
  12.     }
  13.     public void setNum(Integer num) {
  14.         this.num = num;
  15.     }
  16. }

下面才是主要代码

  1. import java.util.ArrayList;
  2. import java.util.List;
  3. public class TestNumber {
  4.     /**
  5.      * @param args
  6.      */
  7.     public static void main(String[] args) {
  8.     
  9.         List<Reader> list = new ArrayList<Reader>();
  10.         for (int i = 1; i < 18; i++) {
  11.             Reader reader=new Reader();
  12.             reader.setPerson(i);
  13.             reader.setNum(i);
  14.             list.add(reader);   
  15.         }
  16.         List dels = new ArrayList<Reader>();
  17.         do {
  18.             
  19.             int j=list.size();
  20.             int m = j;
  21.             for (int i=0;i<j;i++) {
  22.                 Reader read = (Reader) list.get(i);
  23.                 if (read.getNum()%3==0) {
  24.                     dels.add(read);
  25.                     m=m-1;
  26.                 } 
  27.                 read.setNum(read.getNum()+m);
  28.             }
  29.             list.removeAll(dels);
  30.             dels.clear();
  31.             
  32.             
  33.         } while (list.size()!=1);
  34.         
  35.         System.out.println(list.get(0).getPerson()+":"+list.get(0).getNum());
  36.         
  37.         
  38.         
  39.     }
  40. }

结果是11:50

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值