漢の兵士最適化問題(Javaのアルゴリズム)

 

1、問題の説明

  ① 淮安市物語と民俗学- 「韓信の」漢の兵士、部隊「フレーズが続くより優れて。」

行に5台、余分な4;行中7台、6人以上の漢1500人の兵士と戦う、四から五行3に立って人、余分な2を殺しました。104:漢はすぐに番号を言うために。

  ②千年前、「孫子スアン・ジン」は、そのような算術の問題がある:「今日は未知数、残り二百七十から七の3つの数字を、残りの二三〇から三、五十から五数を残りの数が、ありました幾何学的には「今日の言葉に従って:?数は32で分割された尋ね、番号を見つけ、72以上で、53で割っ分割されています。この問題は、としても知られていた「漢の兵士。」それは、つまり、問題のクラスを構成する基本的整数論の合同のソリューションを。

  ③問題:数は32で除算され、53で割っては、一致の最小数を見つけるために、72によって分割されます。

2、締結アイデア

1つのアイデア:[暴力的な解決方法 - 低トラバーサル、効率]

0から大きい値まで判定するように計算されます

    パブリック 静的 INT dealSingle1(INT index0から、int型 index1の、int型 INDEX2){ // 暴力求解
        ブールA、B、C。
        以下のためにint型 ; IにInteger.MAX_VALUEを<I ++は、I = 0 ){ 
            A =(I%3 == index0から)を、
            B =(I%5 == index1の)。
            C =(I%7 == INDEX2)。
            もし(&& B && C){
                 戻り、Iを 
            } 
        } 
        戻り -1 
    }

 

2つの思考:[さらなる最適化を計算することにより、数学的知識の使用は、それが最速である必要があります]

  リストされた最初の数は32で除算される:2,5,8,11,14,17,20,23,26 ......

  そして数は53で割って示しています:3,8,13,18,23,28 ......
  これら2列の数、共通の最初の数は8.3と5がある 最小公倍数 15。2つの条件が、数字列が8,23,38で示します8 + 15×の整数である......、次いで2,9,16,23,30 Iは、...... 72のリストの数で割った値に合成されますタイトル条件の最小数は23であると一直線に来て。
  23で以上の105に加えて:実際には、我々は三つの条件が一つに結合され、すでにタイトルを持っています。
    パブリック 静的 INT dealSingle2(INT index0から、int型 index1の、int型 INDEX2){ // 2、数学方法求解
        のstartTime =   にSystem.currentTimeMillis();
        int型 NUM = 0、NUM1 = 0 ;
        以下のためにint型私= 0;私にInteger.MAX_VALUEを<; iは++ ){ 
            NUM = 3 * I + index0から。
            もし(NUM%5 == {index1の)
                 破壊
            } 
        } 
        のためにint型 ; IにInteger.MAX_VALUE / 15 <; I = 0 iは++ ){ 
            NUM1+ 15 * NUM = I;
             IF(NUM1%は== 7。INDEX2){
                 ロング endTimeは=   にSystem.currentTimeMillis(); 
                のSystem.out.println( "方法2:数学的な最適化、加工:" +(endTime- のstartTime)) ;
                 戻る; NUM1 
            } 
        } 
        リターン -1 ; 
    }

3つのアイデア:[非常に高速で、多数の数値計算によって支配]

    パブリック 静的 INT dealSingle3(INT index0から、int型 index1の、int型 INDEX2){ // 处理单个数据
        のstartTime =   にSystem.currentTimeMillis();
        int型 NUM = -1 ;
        ブールのA、B;
        以下のためにint型私= 0; iは<Integer.MAX_VALUEの/ 7、iは++ ){ 
            NUM = iが7 + * INDEX2を。=(NUM%3 == index0から)。
            B =(NUM%5 == index1の)。
            もし(&& B){
                 長い = endTimeは  System.currentTimeMillis(); 
                のSystem.out.println( "方法3:数学的な最適化、加工:" +(endTime- のstartTime));
                 戻り、NUMを
            } 
        } 
        戻りNUMを; 
    }

 3、問題が延長します

  すべての計算結果[3,5,7ハン兵士全て素数、次いで0〜(3 * 5 * 7-1)この範囲内のすべてのデータが状況です]

    パブリック 静的 INT [] [] [] dealAll(){ // 各計算回だけ、すべてのデータがするまで
        値int [] [] [] = ARR 新しい新しい INT [3] [5] [7 ];
         のためのINT I = 0;私は(<5 * 7 3。。); Iは++ ){ 
            ARR [I%3。] [I. 5%] [%のI. 7] = I; 
        } 
        戻りARR; 
    }

おすすめ

転載: www.cnblogs.com/Mufasa/p/11409388.html