求n个数的最小公倍数的最优算法

楼上说得都很对。在两两计算lcm时,可采用二分的策略,降低lcm的计算次数
■网友
#include \u0026lt;iostream\u0026gt;
using namespace std;
int gcd(int a,int b)
{
if (b==0)
return a;
return gcd(b, a%b);
}
int main()
{
int t;
cin \u0026gt;\u0026gt; t;
while (t--) {
int i,n,m,temp=0,ans=1;
cin \u0026gt;\u0026gt; n;
for (i=0; i\u0026lt;n; i++) {
cin \u0026gt;\u0026gt; m;
temp=gcd(ans,m);
ans=ans/temp*m;
}
cout \u0026lt;\u0026lt; ans \u0026lt;\u0026lt; \u0026#39;\\u0026#39;;
}
return 0;
【求n个数的最小公倍数的最优算法】 }

■网友
每步将两个数替换成它们的最小公倍数,n-1 步后得到所有数的最小公倍数.
■网友
两个数的情况:设两个数分别为a,b先用辗转相除法求gcd(a,b),也就是a,b的最大公约数然后lcm(a,b)=a*b/gcd(a,b)n个数的情况:设n个数分别为a1,a2,……an则先求b1=lcm(a1,a2)再求b2=lcm(b1,a3)b3=lcm(b2,a4)b4=lcm(b3,a5)……最后求到b就是答案复杂度接近O(n)
■网友
鄙人有个很蠢但比较实用的想法,说来大家听听,看看有没有什么可以改进的地方。其实,这个问题的关键我们都看得出来,就是如何快速地把每一个数因式分解,把每个数因式分解后再算出他们的最小公倍数就是轻而易举的事了,但是呢我想了一会也没有想到有什么高级的算法来快速实现因式分解,刚刚也到网上找了下,基本上都是无限次数的试,直到试出来为止,很显然这样会发生不计其数的运算,导致计算效率极其低下。开篇我不是说有一个蠢办法嘛。其实在一开始我就想到了的,只不过这个蠢办法应该避开了因式分解算法的设计,好了,不卖关子了,蠢办法就是利用每个数字的因式分解都具有唯一性的特点,把一定范围内的(你想多大都可以)n个质数从选取1位到选取n位的全排列都得到,然后每一个排列都把里面的元素相乘得到一个积,这样就得到了一个DIY的因式分解表(或者矩阵)。以此为据,再来对需要因式分解的每一个数来往DIY的分解表里查找相应的乘积对应的质数组合,最后再对这些组合进行简单的统计处理就可以得到他们的最小公倍数了。优缺点也很明显,首先缺点就是由于质数组合肯定很多,在运算得到因数分解表的时候应该会花掉比较多的时间,还有一个缺点就是当排列组合达到一定数量后,这会占用较多内存。优点也好说了,对于求解大量的足够多的n个数的最小公倍数问题,这样将节省很多时间,也就是只有最开始生成因数分解表需要花费一次的时间,后面的第二次三次运算就直接调用就好了。爪机码字,先说这么多,我也来尝试找找有没有更好的算法哈,待会用MATLAB测试下了再来更
■网友
两两lcm(nlgm)质因子分解(不会算)
■网友
两两lcm吧,我猜是nlogm?


    推荐阅读