多个数据的最小公倍数
有一种求最小公倍数算分就是先求出所有项的积M,然后M除以每项的到新数列,求出新数列的最大公约数N,最小公倍数就是M/N;
#include <stdio.h>
#include <algorithm>
int a[100011];
int b[100011];
int main()
{
int i,j,n,m,k,sum;
while(scanf("%d",&n)!=EOF)
{
sum=1;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
for(i=0;i<n;i++)
{
scanf("%d",&a[i]);
sum*=a[i];
}
for(i=0;i<n;i++)
{
k=a[i];
a[i]=sum/k;
}
for(i=0;i<n;i++)
{
for(j=1;j*j<=a[i];j++)
{
if(a[i]%j==0)
{
if(a[i]==j*j) b[j]++;
else{
b[j]++;
b[a[i]/j]++;
}
}
}
}
for(i=100011;i>0;i--)
{
if(b[i]==n)
{
m=i;break;
}
}
printf("%d\n",sum/m);
}
return 0;
}
提交显示是运行错误,是数据越界,题目要求的是32位整数,32位就是4个字节,有int 、long型,当输入数据过大时,求出所有数的乘积肯定会越界,所有要换一种算法;
#include <stdio.h> int c(int x,int y) { int temp,t,a,b; if(x<y) { t=x; x=y; y=t; } a=x;b=y; temp=x%y; while(temp!=0) { x=y; y=temp; temp = x%y; } return a*(b/y);//用括号是防止a*b的值越界 } int main() { int i,n,m,a[100024]; while(scanf("%d",&n)!=EOF) { for(i=0;i<n;i++) { scanf("%d",&a[i]); } for(i=1;i<n;i++) { m=c(a[i-1],a[i]); a[i]=m; } printf("%d\n",m); } return 0; }
此算法的思想是,先求出第一个和第二个的最小公倍数,在用这个最小公倍数与第三个求出最小公倍数,以此类推;
当然,为了代码简介点,可以在输入时,就开始求,不必要先把输入数据储存;
还有一个算法
#include<stdio.h> int main() { int i,n,s[500],a; while(scanf("%d",&n)!=EOF) { a=0; for(i=1;i<=n;i++) { scanf("%d",&s[i]); if(a<s[i]) a=s[i]; } for(i=1;i<=n;i++) { if(a%s[i]!=0) { a++; i=0; } } printf("%d\n",a); } return 0; }
就是从最大值开始加,一直到,这个值能整除所有的数,那么就是最小公倍数;