我的LCM计划的复杂性是什么?

时间:2014-05-10 06:28:34

标签: c algorithm complexity-theory

以下是一个程序,用于查找可变数量的LCM。

对于ex:如果我必须找到lcm为3,9,13,那么它执行如下: LCM(1,3) LCM(3,9) LCM(9,13)

我想知道的是这个程序的复杂性。是O(n)还是O(n ^ 2)。你能告诉我为什么会这样吗?

#include <stdio.h>

int gcd(int x,int y)
{
    int n;
    if(x>y)
        n=y;
    else
        n=x;

    while(n>=0){
        if(x%n==0 && y%n==0){
            return n;
            break;
        }
        n--;
}
    return 1;
}

int lcm(int a,int b)
{
    return a*b/gcd(a,b);
}

int main()
{
    int tot,i,l=1;
    int n[10];
    printf("Enter the total numbers:");
    scanf("%d",&tot);
    if(tot>10 || tot<2){
        printf("Sorry invalid inputs");
        return 1;
    }

    printf("Enter the numbers one by one:");
    for(i=0;i<tot;i++)
        scanf("%d",&n[i]);

    for(i=0;i<tot;i++){
        l=lcm(l,n[i]);
    }

    printf("The LCM is %d",l);
    return 0;


}

3 个答案:

答案 0 :(得分:0)

gcd方法的复杂性(也是lcm方法的复杂性)是O(n),其中n是max(x, y)。这是因为在最坏的情况下,x和y是互质的,这意味着n必须递减到1. Euclid的GCD算法更快:http://en.wikipedia.org/wiki/Euclidean_algorithm

答案 1 :(得分:0)

当您调试单个测试用例时,它就是O(n)复杂度。

原因

为计算LCM,你调用* b / gcd(a,b)进一步调用gcd(a,b)

在gcd(a,b)函数中,你创建一个简单的while循环,它用较小的一个模数得到较大数字的模数,直到它通过每次减少一个值而从两个数字中完全可分。所以它是O(n),其中n是两个数字之间的较小的

当您运行多个测试用例时,对于每个测试用例,将需要O(n)

答案 2 :(得分:0)

您可以按以下方式继续:

enter image description here