先来介绍下这个名词的来源:
摘自百度百科:
《九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,原文是:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
白话文译文:
(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用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。
以下是我自己根据算法做的一个实现,比较繁琐,但是可以实现功能,先放在这里,有更好的想法再更新
package com.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; } }
原文地址:http://www.cnblogs.com/xiaoguaishou/p/7190489.html