<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

            用數(shù)組實(shí)現(xiàn)約瑟夫出圈問題,n個人排成一圈,從第一個開始報數(shù),報到m的人出圈,
    剩下的人繼續(xù)開始從1報數(shù),直到所有的人都出圈為止。對于給定的n,m,
    求出所有的人出圈順序。

    class OutOfCircle {
         
    public OutOfCircle(int nn, int mm) {
              n 
    = nn;
              m 
    = mm;
              man 
    = new int[n];                    //使用man數(shù)組表示N個人,man[i]為1表示i還在圈中,為0則表示i已經(jīng)不在圈中
              count = new int[n];                  //保存出圈順序
              java.util.Arrays.fill(man, 1);     //初始化man,一開始所有人都在圈中,所以都為1
         }


         
    public int[] out() {
              
    int c = 0;                      //當(dāng)前人報的數(shù)
              int j = 0;
              
    while (total(man) != 0{      //當(dāng)圈中沒人時,man中元素之和為0
                   for (int i = 0; i < n; i++{
                       c 
    = c + man[i];                     //報數(shù),出去的人為0,相當(dāng)于沒報
                        if (c != 0 && c % m == 0{        //表示當(dāng)前c!=0一定要加上,因為0對任何數(shù)取余都為0
                             man[i] = 0;                             //出圈,置為0
                             count[j++= i + 1;                //保存出圈人的編號
                             c = 0;                                //重新開始報數(shù)  
                        }

                   }

              }

              
    return count;
         }


         
    private int total(int[] t) {  //求INT數(shù)組的和
              //int sum = 0;
              
    for (int i : t) {
                   //sum 
    += i;
                        if(t[i]!=0) return 1;
                  }
                 return 0;
              //
    return sum;
         }


         
    private int n;    
         
    private int m;   
         
    private int[] man;
         
    private int[] count; 
    }

    posted on 2008-11-19 17:34 Bom Wu 閱讀(2198) 評論(7)  編輯  收藏
    Comments
    • # re: 約瑟夫環(huán)問題求解[未登錄]
      littleq
      Posted @ 2008-11-20 12:30
      判斷圈內(nèi)是否有人,用total這個方法,好像有點(diǎn)多余吧,你既然用for循環(huán)了,那就
      if(t[i]!=0)return 1;
      這樣還能少循環(huán)幾次
        回復(fù)  更多評論   
    • # re: 約瑟夫環(huán)問題求解
      Bom Wu
      Posted @ 2008-11-20 14:42
      @littleq
      對對對,不用關(guān)心還有幾個人,只要存在t[i]==1那就表示有人,不用全加起來了,多謝指教呀!  回復(fù)  更多評論   
    • # re: 約瑟夫環(huán)問題求解
      object
      Posted @ 2008-11-20 14:57
      import java.util.ArrayList;
      import java.util.List;


      /**
       * 
      @author huangjie
       * @createDate 2008-11-20
       * @package 
       * @fileName OutofCircle.java
       *
      */

      public class Test{
          
      public static void main(String[] args){
              OutOfCirle ooc
      =new OutOfCirle(1000,10000);
              ooc.begin();
          }

      }

      class OutOfCirle {
          
      //報出了這個數(shù)的都退出
          public static int outNumber;
          
      //總的有多少個人
          public static int manSize;
          
      //上面2個一開始就固定好了,所以我就聲明成static
          
          
      //圈中的人
          private List<Man> allMan;
          
      //現(xiàn)在已經(jīng)報到第幾號了,初始化為1
          private int nowNumber=1;
          
      //現(xiàn)在已經(jīng)報到第幾個人了,初始化為0;
          private int nowMan=0;
          
          
      public OutOfCirle(int manSize,int outNumber){
              OutOfCirle.manSize
      =manSize;
              OutOfCirle.outNumber
      =outNumber;
              init();
          }

          
      private void init(){
              allMan
      =new ArrayList();
              
      //初始化所有人,即把所有人編上號
              int manNumber=0;
              
      while(OutOfCirle.manSize!=manNumber){
                  allMan.add(
      new Man(++manNumber));
              }

          }

          
      public void begin(){
              
      while(allMan.size()>0){
                  Man man 
      =this.select();
                  
      //把這個人T出去
                  allMan.remove(man);
                  
      //當(dāng)T的是最后一個的時候,又從第一個開始數(shù)
                  if(nowMan==allMan.size()){
                      nowMan
      =0;
                  }

                  
      //說明T的不是最后一個
                  
      //T的人的后面的都會往前移一個位置
                  
      //這樣就把原來的nowman代替了,就可以從nowman開始數(shù)了
                  else{
                      
                  }

                  
      //選出來了以后又從1開始報
                  nowNumber=1;
                  System.out.println(
      "我是第"+man.getNumber()
                          
      +"號,我現(xiàn)在被T出去了,我是第"
                          
      +(manSize-allMan.size())+"個被T的"
                          
      +",還有"+allMan.size()+"在圈里");
              }

              System.out.println(
      "所有人都被T出去完了");
          }

          
      //找出報outNumber的人
          private Man select(){
              Man man
      =null;
              
      //沒選出來就一直報數(shù)
              while(man==null){
                  
      //nowman報數(shù)
                  Man m=allMan.get(nowMan);
                  
      boolean right=m.reckon(nowNumber);
                  
      //就是他了
                  if(right){
                      man
      =m;
                  }

                  
      //說明不是他
                  else{
                      
      //報的數(shù)字到下一個
                      nowNumber++;
                      
      //人也到下一個去
                      nowMan++;
                      
      //說明已經(jīng)到了最后一個了
                      if(nowMan==allMan.size()){
                          
      //又從第一個開始報數(shù)
                          nowMan=0;
                      }

                  }

              }

              
      return man; 
          }


      }

      class Man{
          
      private int number;
          
      public Man(int number){
              
      this.number=number;
          }

          
      public int getNumber() {
              
      return number;
          }

          
      //報數(shù):判斷報出的數(shù)字是否和outNumber
          public boolean reckon(int num){
              
      return num==OutOfCirle.outNumber;
          }

      }

      你的方法太不面向?qū)ο罅?看我寫的
        回復(fù)  更多評論   
    • # re: 約瑟夫環(huán)問題求解
      object
      Posted @ 2008-11-20 14:59
      你的太不面向?qū)ο罅?看我的   回復(fù)  更多評論   
    • # re: 約瑟夫環(huán)問題求解
      Bom Wu
      Posted @ 2008-11-20 15:08
      看來對面向?qū)ο蟮睦斫膺€真是不一樣。多謝指教!  回復(fù)  更多評論   
    • # re: 約瑟夫環(huán)問題求解
      object
      Posted @ 2008-11-20 15:32
      其實(shí)每個人都有自己的一套理解方式,呵呵,對象這個東西,有的時候給別人講解的時候根本就講解不出來
        回復(fù)  更多評論   
    • # re: 約瑟夫環(huán)問題求解
      小七群
      Posted @ 2008-11-20 16:59
      要考慮到n<m的情況嗎?  回復(fù)  更多評論   

    只有注冊用戶登錄后才能發(fā)表評論。


    網(wǎng)站導(dǎo)航:
     
     
    主站蜘蛛池模板: AV在线播放日韩亚洲欧| 麻豆安全免费网址入口| 久久久久亚洲av成人无码电影 | 免费va人成视频网站全| 67pao强力打造高清免费| 一级毛片不卡免费看老司机 | 午夜成年女人毛片免费观看| 久久狠狠躁免费观看2020| 特级毛片A级毛片免费播放| 亚洲中文字幕久久精品无码VA| 亚洲a在线视频视频| 最新亚洲成av人免费看| 色www永久免费视频| 99久久综合国产精品免费| 久久99精品免费视频| 久久www免费人成精品香蕉| 最新亚洲人成无码网站| 亚洲欧美日韩一区二区三区在线| 91亚洲国产在人线播放午夜 | 色综合久久精品亚洲国产| 亚洲AV成人影视在线观看 | 色欲国产麻豆一精品一AV一免费 | 亚洲一级特黄无码片| 无码欧精品亚洲日韩一区夜夜嗨 | 一色屋成人免费精品网站| 久久午夜伦鲁片免费无码| 中国国语毛片免费观看视频| 牛牛在线精品观看免费正| 男男gvh肉在线观看免费| 亚洲AV无码一区二区乱子仑| 中文字幕亚洲综合久久综合| 亚洲一本之道高清乱码| 亚洲人成7777影视在线观看| 亚洲噜噜噜噜噜影院在线播放| 亚洲欧洲春色校园另类小说| 久久亚洲AV无码精品色午夜| 亚洲美女视频网址| 亚洲成a人片在线网站| 亚洲av永久无码精品三区在线4| 亚洲综合丁香婷婷六月香| 国产成人精品日本亚洲专|