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; }