如何使用递归或任何其他方法实现L.C.M(1到N),N> 2?

时间:2015-03-08 20:10:51

标签: c math recursion

我一直试图通过素数分解在C语言中实现L.C.M(1,2,....,20)。我搜遍了谷歌,但他们只是两个变量的方法。 我写了这段代码:

int lcm(int a[i],int n)
{
//n is the nth number to find L.C.M, for eg: LCM(1,2,...,20) Here,N=20
//a[i] is the list of primes upto n;
     K=sqrt(n);
     while(pow(a[i],k)>n)
         K=K-1;
     P=P*pow(a[i],k);
/*My idea over here is to make a list of primes up to 'n' and store them in list a[i]. Then for each each prime in the list,the power of that prime should exceed 'n'.
For eg: Let, N=10 .. K=3 ,
             Pow(2,3)=8<10
So,P=1*8,and for the remaining primes {3,5,7},it can be represented in prime factorization:
P=2^3 * 3^2 * 5^1 * 7^1 = 2520.
}*/

我在实现它时遇到了问题,因为我对Arrays知之甚少,我觉得这个算法效率不高。 我对使用递归或任何其他有效方法找到LCM(1到N)非常感兴趣。请帮助!

2 个答案:

答案 0 :(得分:2)

素数因子分解不是计算lcm(a,b)的有效方法。实现它的一个好方法是使用公式:

lcm(a,b) = a / gcd(a,b) * b

现在,一个简单而有效的计算gcd(a,b)的算法如下:

Set n := a; m := b.
While {n != 0} do {s := n. n := m % m. m := s}.
Return abs(m)

其中m % n代表模运算,即余数模n

现在我们知道如何计算lcm(a,b),我们可以递归地进行:

lcm(a[i],k)
    if k = 1
      Return a[0] / gcd(a[0],a[1]) * a[1]
    else
      Return lcm(lcm(a[i],k-1),a[k])

答案 1 :(得分:2)

执行此操作的最快方法可能是了解LCM的两个属性。

  1. LCM是关联的。这意味着LCM(a,b,c) = LCM(LCM(a,b),c)。这使您可以找到大量数字的LCM,同时只计算其中两个数字的LCM。基本上,您从L = 1开始,然后循环i=120L = LCM(L, i)
  2. LCM(x,y)*GCD(x,y) == x*y,表示LCM(x,y) == x*y/GCD(x,y)Euclid's algorithm for GCD比分解更快,因此您可以使用它来快速计算LCM。
  3. 使用这两个属性,您应该能够设计一个没有任何复杂数据结构或算法的快速LCM系统。

    以下是案例[1, 2... 20]的代码段的框架。

    int L = 1;
    for(int i = 1; i <=20; i++){
        L = LCM(L,i);
    }
    // L contains the LCM of 1 to 20