以下是一个程序,用于查找可变数量的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;
}
答案 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)
您可以按以下方式继续: