多個最小公倍數/最大公約數(最高效演算法模板)
阿新 • • 發佈:2018-12-09
最小公倍數和最大公約數
兩數最小公倍數
輾轉相除法求最大公約數,使a>b,a,b不斷取餘數直到a,b相等
int gcd(int a, int b)
{
if(a < b) a = a^b, b = b^a, a = a^b;
int c = a%b;
while(a%b != 0){
a = b, b = c, c = a % b;
}
return b;
}
兩數最大公約數
a*b/gcd(a,b)
多個數最小公倍數
但注意一定要大於兩個數才可以,從第二個數開始,依次和第一個數取gcd(沒錯就是這麼簡單)
int gcd(int a, int b) { if(a < b) a = a^b, b = b^a, a = a^b; int c = a%b; while(a%b != 0){ a = b, b = c, c = a % b; } return b; } int main() { int num[20], n; scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%d",&num[i]); int ans = num[1]; for(int i = 2; i <= n; i++) ans = gcd(ans, ans); printf("%d",ans); return 0;
多個數最大公約數
也很簡單,從第二個數開始依次和第一個數取lcm;
int gcd(int a, int b) { if(a < b) a = a^b, b = b^a, a = a^b; int c = a%b; while(a%b != 0){ a = b, b = c, c = a % b; } return b; } int main() { int num[20], n; scanf("%d",&n); for(int i = 1; i <= n; i++) scanf("%d",&num[i]); int ans = num[1]; for(int i = 2; i <= n; i++) ans = ans*num[i]/gcd(ans, num[i]); printf("%d",ans); return 0; }