辗转相除法 GCD

辗转相除法(gcd)

介绍:

欧几里德算法又称辗转相除法,是指用于计算两个正整数a,b的最大公约数。应用领域有数学和计算机两个方面。
计算公式gcd(a,b) = gcd(b,a mod b)。
a mod b : a除以b的余数

实现方法:

1 递归

public int GCD(int a,int b) {
        if(b==0)
            return a;
        else
            return GCD(b,a%b);
    }

2 循环

public int  GCD_base(int a,int b)
    {
        int r;
        while(b>0)
        {
             r=a%b;
             a=b;
             b=r;
        }
        return a;
    

例题:LeetCode 1071. 字符串的最大公因子

题目:对于字符串 S 和 T,只有在 S = T + … + T(T 与自身连接 1 次或多次)时,我们才认定 “T 能除尽 S”。

返回最长字符串 X,要求满足 X 能除尽 str1 且 X 能除尽 str2。

示例 1:

输入:str1 = “ABCABC”, str2 = “ABC”
输出:“ABC”

示例 2:

输入:str1 = “ABABAB”, str2 = “ABAB”
输出:“AB”

示例 3:

输入:str1 = “LEET”, str2 = “CODE”
输出:""

思路参考官方题解:
先判断 str1 和 str2 拼接后是否等于 str2 和 str1 拼接起来的字符串,如果等于直接输出长度为 gcd(len1,len2)的前缀串即可,否则返回空串。

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

class Solution {
    public String gcdOfStrings(String str1, String str2) {
        // 假设str1是N个x,str2是M个x,那么str1+str2肯定是等于str2+str1的。
        if (!(str1 + str2).equals(str2 + str1)) {
            return "";
        }
        // 辗转相除法求gcd。
        return str1.substring(0, gcd(str1.length(), str2.length()));
    }

    private int gcd(int a, int b) {
        return b == 0? a: gcd(b, a % b);
    }
}

你可能感兴趣的:(IT,刷题)