关于求N个数的最小公倍数,该如何解决
关于求N个数的最小公倍数
今天在做ACM上的题做到第2028(11页)时:
#include<iostream>
using namespace std;
int LCM(int m,int n)//辗转相除
//我用这个函数求提交不能通过很郁闷
{
int a=m,r,b=n;
while(n)
{
r=n;
n=m%n;
m=r;
}
return (a*b)/m;
}
int LCM(int m,int n)//这种方法(相当于一步一步求却行)可以通过
{
int multiply=1;
for(int i=2;i<=m&&i<=n;i++)
if(m%i==0&&n%i==0)
{
multiply*=i;
m/=i;
n/=i;
i=1;
}
return multiply*m*n;
}
int main()
{
int n,*p;
while(cin>>n)
{
p=new int [n];
for(int i=0;i<n;i++)
cin>>p[i];
for(i=0;i<n-1;i++)
p[i+1]=LCM(p[i],p[i+1]);
cout<<p[i]<<endl;
}
return 0;
}
因为想着第一种方法好点,于是先写的第一种...可是一直 wrong answer...
麻烦指点下辗转相除和一般做法有什么不同? 少考虑什么了?
都是两个两个的求最大公倍数....
------解决方案--------------------
这个程序的结果是零,显然不对!
今天在做ACM上的题做到第2028(11页)时:
#include<iostream>
using namespace std;
int LCM(int m,int n)//辗转相除
//我用这个函数求提交不能通过很郁闷
{
int a=m,r,b=n;
while(n)
{
r=n;
n=m%n;
m=r;
}
return (a*b)/m;
}
int LCM(int m,int n)//这种方法(相当于一步一步求却行)可以通过
{
int multiply=1;
for(int i=2;i<=m&&i<=n;i++)
if(m%i==0&&n%i==0)
{
multiply*=i;
m/=i;
n/=i;
i=1;
}
return multiply*m*n;
}
int main()
{
int n,*p;
while(cin>>n)
{
p=new int [n];
for(int i=0;i<n;i++)
cin>>p[i];
for(i=0;i<n-1;i++)
p[i+1]=LCM(p[i],p[i+1]);
cout<<p[i]<<endl;
}
return 0;
}
因为想着第一种方法好点,于是先写的第一种...可是一直 wrong answer...
麻烦指点下辗转相除和一般做法有什么不同? 少考虑什么了?
都是两个两个的求最大公倍数....
------解决方案--------------------
这个程序的结果是零,显然不对!
- C/C++ code
#include <iostream> using namespace std; int lcm(int m, int n) { int m_temp = m; int n_temp = n; int temp; while(n!=0) { temp = m%n; m = n; n = temp; } return m_temp*n_temp/m; } int main() { cout<<lcm(65536, 65536)<<endl; return 0; }