【问题标题】:Finding Greatest Common Divisor using Euclidean Algorithm使用欧几里得算法找到最大公约数
【发布时间】:2020-03-25 13:02:42
【问题描述】:

我试图找出一个解决方案,通过它我可以以最佳方式找到 2 个数字的 GCD, 因此,我需要一些帮助来确定我提出的程序是否适用于所有可能的情况,或者是否有任何情况会崩溃,或者我是否可以对其进行更多改进以使其成为最佳解决方案。

程序:

public static void main(String[] args) {
     int a= 153;
        int b= 81;
        boolean flag = true;
        int gcd = 1;
        while(flag)
        {
          if(a>b && a%b ==0)
           {
                flag = false;
                gcd = b;
            }
            else if(b>a && b%a ==0)
            {
                flag=false;
                gcd = a;
            }
            else if( a>b)
            a = a-b;
            else
            b = b-a;
        }
        System.out.println(gcd);

}

请帮助我找出正确的解决方案,在此先感谢。

【问题讨论】:

    标签: java greatest-common-divisor


    【解决方案1】:

    试试这样的。欧几里得 GCD 算法基本上是这样说的:2 个数的 GCD(我们将它们称为越来越小)等于较小数的 GCD 以及较大和较小数之间的差异。重复此过程,直到两个数字相同。 以下是迭代解决方案。

        int a= 153 , b = 81, gcd = 1;
    
        while( gcd != a ) {
    
            if( a > b ) a -= b;
            else if( b > a) b -= a;
            else gcd = a;
        }
    
        System.out.println(gcd);
    

    这是递归解决方案。希望这会有所帮助。

        public static int euclidGCD(int a, int b) {
            if (b == a) return a;
            if (b > a)  return euclidGCD(b - a, a);
            else  return euclidGCD(a - b, b);
    }
    

    这是对您的程序的修改。 要测试一个程序,最好的办法是写下它的条件和案例。 在这个练习中有两个条件:

    • 1.) 数字必须是整数
    • 2.) 数字必须为正数。

    处理数字通常有离散数量的案例。在这个练习中有两种情况:

    • 1.) 数量相等。
    • 2.) 数字不同。

    当 a 等于 b 时,您的代码不正确(自己尝试)。当数字不同时,您的代码可以正常工作。下面是修改。

        int a= 55;
        int b= 55;
        boolean flag = true;
        int gcd = b;
        while(flag && b != a)
        {
            if(a>b && a%b ==0)
            {
                flag = false;
                gcd = b;
            }
            else if(b>a && b%a ==0)
            {
                flag=false;
                gcd = a;
            }
            else if( a>b)
                a = a-b;
            else
                b = b-a;
        }
        System.out.println(gcd);
    

    【讨论】:

    • 即使我尝试过同样的事情,但也尝试过使用一点模数,但我不确定我的即兴创作是否适用于所有情况
    • 感谢输入是很好的测试案例和对代码的良好优化
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-05
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多