更新减损术的Java实现

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了更新减损术的Java实现相关的知识,希望对你有一定的参考价值。

先来介绍下这个名词的来源:

 摘自百度百科:

九章算术》是中国古代的数学专著,其中的“更相减损术”可以用来求两个数的最大公约数,原文是:可半者半之,不可半者,副置分母、子之数,以少减多,更相减损,求其等也。以等数约之。
 
白话文译文:
(如果需要对分数进行约分,那么)可以折半的话,就折半(也就是用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

以上是关于更新减损术的Java实现的主要内容,如果未能解决你的问题,请参考以下文章

DVB条件接收系统多密技术的设计与实现

# Java 常用代码片段

# Java 常用代码片段

java 代码片段

LockSupport.java 中的 FIFO 互斥代码片段

更相减损术--最大公约数