更新減損術的Java實現
阿新 • • 發佈:2017-07-16
bsp tex .com 繼續 做的 表示 || 但是 個數
先來介紹下這個名詞的來源:
摘自百度百科:
《九章算術》是中國古代的數學專著,其中的“更相減損術”可以用來求兩個數的最大公約數,原文是:可半者半之,不可半者,副置分母、子之數,以少減多,更相減損,求其等也。以等數約之。 白話文譯文: (如果需要對分數進行約分,那麽)可以折半的話,就折半(也就是用2來約分)。如果不可以折半的話,那麽就比較分母和分子的大小,用大數減去小數,互相減來減去,一直到減數與差相等為止,用這個相等的數字來約分。使用步驟
第一步:任意給定兩個正整數;判斷它們是否都是偶數。若是,則用2約簡;若不是則執行第二步。 第二步:以較大的數減較小的數,接著把所得的差與較小的數比較,並以大數減小數。繼續這個操作,直到所得的減數和差相等為止。 則第一步中約掉的若幹個2與第二步中等數的乘積就是所求的最大公約數。 其中所說的“等數”,就是最大公約數。求“等數”的辦法是“更相減損”法。 使用實例: 例1、用更相減損術求98與63的最大公約數。 解:由於63不是偶數,把98和63以大數減小數,並輾轉相減: 98-63=35 63-35=28 35-28=7 28-7=21 21-7=14 14-7=7 所以,98和63的最大公約數等於7。 例2、用更相減損術求260和104的最大公約數。 解:由於260和104均為偶數,首先用2約簡得到130和52,再用2約簡得到65和26。 此時65是奇數而26不是奇數,故把65和26輾轉相減: 65-26=39 39-26=13 26-13=13 所以,260與104的最大公約數等於13乘以第一步中約掉的兩個2,即13*2*2=52。 以下是我自己根據算法做的一個實現,比較繁瑣,但是可以實現功能,先放在這裏,有更好的想法再更新packagecom.henu.test; import java.util.HashMap; import java.util.Map; public class MathDemo { public static void main(String[] args) { //在這裏輸入你要求的兩個數 Map<String, Object> map = math(98,63); for(Map.Entry<String, Object> entry:map.entrySet()){ System.out.println(entry.getKey()+"----"+entry.getValue()); } } /** * 更相減損術 * @param a * @param b * @return */ public static Map<String, Object> math(int a, int b){ Map<String, Object> map = new HashMap<>(); int count = 0; int temp = 0;int max =0; for(;a%2==0 && b%2==0;){ a=a/2; b=b/2; count++; } out : while((a-b>0 && a-b !=b) ||(b>a && b-a != a) || a == b || b-a == a || a - b == b){ // while(a-b==0 || b-a==0){ if (a == b ) { temp = b; break out; }else if ( b>a && b-a != a) { temp = b-a; b = temp; }else if (a-b>0 && a-b !=b) { temp = a-b; a = temp; }else if (b-a == a ) { temp = a; break out; }else if (a - b == b ) { temp = b; break out; } } max = (int) Math.pow(2, count) * temp; //計算到最後a的值 map.put("a", a); //計算到最後b的值 map.put("b", b); //表示共同被2整除的次數 map.put("count", count); //最後求得的最大公約數 map.put("max", max); return map; } }
更新減損術的Java實現