http://acm.hdu.edu.cn/showproblem.php?pid=2028
逐个用辗转相除法算出最小公倍数,直至结束,但是因为中间结果有可能超过32位,所以必须相除后乘,只是这里不懂为什么改了long long还是错掉
r=a%b;
while(r)
{
a=b;
b=r;
r=a%b;
}
结果b是最大公约数,最小公倍数就是原来ab的积除以b
View Code
1 #include<stdio.h> 2 #include<stdlib.h> 3 int s[100000]; 4 int pro(int a,int b) 5 { 6 int t,r,j,a0,b0; 7 if(a<b) 8 { 9 t=a; 10 a=b; 11 b=t; 12 } 13 a0=a; 14 b0=b; 15 t=b; 16 r=a%b; 17 while(r) 18 { 19 a=b; 20 b=r; 21 r=a%b; 22 } 23 r=a0*(b0/b); 24 return r; 25 } 26 int main() 27 { 28 int n,i,j,a; 29 while(scanf("%d",&n)!=EOF) 30 { 31 a=1; 32 for(i=0;i<n;i++) 33 scanf("%d",&s[i]); 34 for(i=0;i<n;i++) 35 a=pro(a,s[i]); 36 printf("%d\n",a); 37 } 38 return 0; 39 }