1.gcd函数介绍(求最大公约数)
简介:Greatest Common Divisor,缩写为 gcd。
分析:gcd函数通常用于求解两个数的最大公约数,介绍两种常用求解方法
1)方法一:辗转相除法(欧几里得法)
递归实现辗转相除公式 gcd(a,b) =
int gcd(int a, int b){
return b ? gcd(b, a % b) : a;
}
2)方法二: 用c++自带库 (VS2019后不适用)
#include<algorithm> 添加头文件即可
int res = __gcd(a, b)
需要注意的是,类似__gcd() 前面有“__”的函数,一般是GNU添加的函数,VS编译器一般是没有的。
2.lcm算法介绍(求最小公倍数)
简介:lowest common multiple,缩写为 lcd。
分析:lcd函数用于求解最小公倍数,核心在于一个数学定理 lcm(a, b) = a * b / gcd(a, b),利用最大公约数去求解最小公倍数
重点: 两个数相乘 == 最大公约数*最小公倍数 (即 ab = pq) 得到lcm(a, b) = a * b / gcd(a, b)
lcm(a, b) = a * b / gcd(a, b);
题目实战:
一. 力扣 1979. 找出数组的最大公约数 easy
这道题目是最简单的两个数字求最大公约数,根据我们上面的公式套用即可
题解:
class Solution {
public:
int findGCD(vector<int>& nums) {
sort(nums.begin(),nums.end());
return gcd( nums[nums.size()-1],nums[0]);
}
int gcd(int a, int b){
return b ? gcd(b, a%b) : a;
}
};
二. 力扣 1071. 字符串的最大公因子 easy
虽然是难度是easy,但这道题目有变化,由求数变为求字符串的最大公约数。
题解:
class Solution {
public:
string gcdOfStrings(string str1, string str2) {
return (str1 + str2 == str2 + str1) ? str1.substr(0, gcd(str1.size(), str2.size())) : "";
}
};
相信做完这两道题目你就可以掌握绝大部分求最大公约数的题目了~