3F - Lowest Common Multiple Plus
求n个数的最小公倍数。
Input
输入包含多个测试实例,每个测试实例的开始是一个正整数n,然后是n个正整数。
Output
为每组测试数据输出它们的最小公倍数,每个测试实例的输出占一行。你可以假设最后的输出是一个32位的整数。
Sample Input
2 4 6 3 2 5 7
Sample Output
12 70
// 数据溢出
1 #include<stdio.h> 2 3 int cmd(int a, int b) 4 { 5 int t=1; 6 if(a<b) 7 { t=a; a=b; b=t; } 8 while(t!=0) 9 { t=a%b; a=b; b=t; } 10 return a; 11 } 12 13 int cmm(int a, int b) 14 { 15 int d; 16 d=cmd(a, b); 17 return a*b/d; 18 } 19 20 int main() 21 { 22 int n, x,y; 23 while(~scanf("%d", &n)) 24 { 25 y=1; 26 while(n--) 27 { 28 scanf("%d", &x); 29 y=cmm(x,y); 30 } 31 printf("%d\n", y); 32 } 33 return 0; 34 }
// 把cmm()中的return a*b/d;改为return a/d*b; 在数据接近int能表示的最大值时,先乘很可能溢出
1 #include<stdio.h> 2 3 int cmd(int a, int b) 4 { 5 int t=1; 6 if(a<b) 7 { t=a; a=b; b=t; } 8 while(t!=0) 9 { t=a%b; a=b; b=t; } 10 return a; 11 } 12 13 int cmm(int a, int b) 14 { 15 int d; 16 d=cmd(a, b); 17 return a/d*b; 18 } 19 20 int main() 21 { 22 int n, x,y; 23 while(~scanf("%d", &n)) 24 { 25 y=1; 26 while(n--) 27 { 28 scanf("%d", &x); 29 y=cmm(x,y); 30 } 31 printf("%d\n", y); 32 } 33 return 0; 34 }
// 从最大数开始枚举
1 #include<stdio.h> 2 3 int main() 4 { 5 int n, x[100],y; 6 while(~scanf("%d", &n)) 7 { 8 y=1; 9 for(int i=0;i<n;i++) 10 { 11 scanf("%d", &x[i]); 12 y=y>x[i]?y:x[i]; 13 } 14 for(int i=0;i<n;i++) 15 if(y%x[i]!=0) 16 { y++; i=-1; } 17 printf("%d\n", y); 18 } 19 return 0; 20 }
// 补充:用unsigned int能表示的正数多一些