gcd 算法–辗转相除法
遇到一题算法题,如下:
求字符串的最大公因子?
对于字符串 s 和 t,只有在 s = t + … + t(t 自身连接 1 次或多次)时,我们才认定 “t 能除尽 s”。
给定两个字符串 str1 和 str2 。返回 最长字符串 x,要求满足 x 能除尽 str1 且 x 能除尽 str2 。
接下来回顾下两个数学概念:
- 约数。整数a除以整数b(b≠0)除得的商正好是整数而没有余数,那么整数b称为a的约数。即4的正约数有:1、2、4。代入到字符串中,则意味着字符串ABC的约数(其实就是子字符串)共有A,B,C三个。
- 最大公约数。两个或多个整数共有约数中最大的一个被称为最大公约数。举例:求数值3和数值9的最大公约数。数值3的正约数有1,3,数值9的正约数有1,3,9,数值3与数值9约数并集(既存在3的约数集中,又存在9的约数集中的数的集合)为1、3。则最大公约数为3。写作gcd(3,
9) = 3。附,gcd是英文Greatest Common
Divisor(最大公约数)的缩写。代入到字符串中,则字符串ABCABC和字符串ABC的最大公约数为ABC,即本题中所需要的最大公因子。
那么问题的关键就可以,如何求得最大公约数?在数学中,可以利用辗转相除法来计算最大公约数。
辗转相除法是以除数和余数反复做除法运算,当余数为 0 时,取当前算式除数为最大公约数的计算公式。如下:
1997 / 615 = 3 (余 152)
615 / 152 = 4(余7)
152 / 7 = 21(余5)
7 / 5 = 1 (余2)
5 / 2 = 2 (余1)
2 / 1 = 2 (余0)
至此,最大公约数为1
由此,可以写出gcd函数:
// 最大公约数计算公式
function gcd(num1, num2) {
// 利用辗转相除法来计算最大公约数
return num2 === 0 ? num1 : gcd(num2, num1 % num2);
}
所以,整道题的题解是:
因此代码为:文章来源:https://www.toymoban.com/news/detail-541215.html
var gcdOfStrings = function(str1, str2) {
if(str1 + str2 !== str2 + str1) return '';
const gcd =(a,b)=>(0===b?a:gcd(b,a%b))
return str1.substring(0,gcd(str1.length,str2.length))
};
考题出处:https://leetcode.cn/problems/greatest-common-divisor-of-strings/submissions/文章来源地址https://www.toymoban.com/news/detail-541215.html
到了这里,关于算法--辗转相除法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!