2010-07-01 69 views

回答

100

ab最小公倍數(LCM)是他們的產品通過自己的最大公約數(GCD)(即lcm(a, b) = ab/gcd(a,b))劃分。

那麼,問題就變成了,如何找到gcd? Euclidean algorithm一般是如何計算gcd的。經典算法的直接實現是高效的,但是有一些變體可以利用二進制算法做得更好一些。見Knuth的「The Art of Computer ProgrammingVolume 2, "Seminumerical Algorithms" § 4.5.2

+58

是的,使用GCD的LCM編碼速度快,易於編碼。一個小而重要的細節:爲了避免溢出,計算最終結果如下:'lcm = a/gcd * b'而不是'lcm = a * b/gcd'。 – Bolo 2010-07-01 01:41:14

+5

@Bolo - 如果你擔心溢出,你應該使用'long'或者在其他情況下使用'BigInteger'。兩個「int」值的LCM可能是一個「long」。 – 2010-07-01 01:47:01

+9

@Stephen C使用Bolo的方法,如果LCM可以表示,則可以計算出沒有溢出的LCM。乘法不需要使用更大更慢的數字類型。 – starblue 2010-07-01 04:39:12

0

取兩個數中較大者的連續倍數,直到結果爲較小值的倍數。

這可能工作..

public int LCM(int x, int y) 
    { 
     int larger = x>y? x: y, 
      smaller = x>y? y: x, 
      candidate = larger ; 
     while (candidate % smaller != 0) candidate += larger ; 
     return candidate; 
    } 
+0

對於x和y的小值,這將工作正常,它將難以縮放。 – andand 2010-07-01 03:12:57

4

請記住 最小公倍數是整數的最小值,它是兩個或更多數字中每一個的倍數。

如果你想找出LCM的三個整數,請按照下列步驟操作:

**Find the LCM of 19, 21, and 42.** 

寫每個數字的質數分解。 19是一個素數。您不需要因子19.

21 = 3 × 7 
42 = 2 × 3 × 7 
19 

重複每個素因子因子在上述任何素因子因子中出現的最大次數。

2×3×7×19 = 798

21的最小公倍數,42和19是798

+0

非常好,如果你已經需要其他計算的素因子分解 – 2016-04-28 16:35:47

+0

不幸的是,發現任意數的素因子分解是一個「難題」https://en.wikipedia.org/wiki/Prime_factor#Cryptographic_applications – BlackSheep 2017-08-25 18:03:59

1

首先,你必須找到最大公約數

for(int = 1; i <= a && i <= b; i++) { 

    if (i % a == 0 && i % b == 0) 
    { 
     gcd = i; 
    } 

} 

之後,使用GCD可以輕鬆地找到最小公倍數這樣

lcm = a/gcd * b; 
1

,我不知道是否進行了優化或沒有,但可能是最簡單一個:

public void lcm(int a, int b) 
{ 
    if (a > b) 
    { 
     min = b; 
     max = a; 
    } 
    else 
    { 
     min = a; 
     max = b; 
    } 
    for (i = 1; i < max; i++) 
    { 
     if ((min*i)%max == 0) 
     { 
      res = min*i; 
      break; 
     } 
    } 
    Console.Write("{0}", res); 
} 
1

在C++中最好的解決辦法如下而不溢出

#include <iostream> 
using namespace std; 
long long gcd(long long int a, long long int b){   
    if(b==0) 
     return a; 
    return gcd(b,a%b); 
} 

long long lcm(long long a,long long b){  
    if(a>b) 
     return (a/gcd(a,b))*b; 
    else 
     return (b/gcd(a,b))*a;  
} 

int main() 
{ 
    long long int a ,b ; 
    cin>>a>>b; 
    cout<<lcm(a,b)<<endl;   
    return 0; 
} 
1

C++模板。編譯時間

#include <iostream> 

const int lhs = 8, rhs = 12; 

template<int n, int mod_lhs=n % lhs, int mod_rhs=n % rhs> struct calc { 
    calc() { } 
}; 

template<int n> struct calc<n, 0, 0> { 
    calc() { std::cout << n << std::endl; } 
}; 

template<int n, int mod_rhs> struct calc<n, 0, mod_rhs> { 
    calc() { } 
}; 

template<int n, int mod_lhs> struct calc <n, mod_lhs, 0> { 
    calc() { } 
}; 

template<int n> struct lcm { 
    lcm() { 
    lcm<n-1>(); 
    calc<n>(); 
    } 
}; 

template<> struct lcm<0> { 
    lcm() {} 
}; 

int main() { 
    lcm<lhs * rhs>(); 
} 
0

2個數字的乘積等於LCM * GCD或HCF。因此找到LCM的最佳方式是找到GCD並將產品與GDC分開。

+0

GDC?你的意思是GCD? – Pang 2018-01-05 08:25:47

+0

無論如何,這聽起來像是現有答案的重複。 – Pang 2018-01-05 08:28:05

相關問題