描述 一组正整数的最小公倍数(LCM)是可以被集合中所有数字整除的最小正整数。 例如,5,7和15的LCM为105。 输入 输入将包含多个问题实例。 输入的第一行将包含指明问题实例数量的单个整数。 每个实例将由形式为m n1 n2 n3 ... nm的单行组成,其中m是集合中的整数数目,n1 ... nm是整数。 所有整数将为正,位于32位整数的范围内。 输出 对于每个问题实例,输出包含相应LCM的单行。 所有结果将位于32位整数的范围内。 样例输入 2 3 5 7 15 6 4 10296 936 1287 792 1 样例输出 105 10296
求最小公倍数问题,一个蠢办法是从第一个开始一个个试:
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 9 int n,m,a,k; 10 while(scanf("%d",&n)!=EOF&&n) 11 { 12 while(n--) 13 { 14 scanf("%d",&m); 15 int t=1; 16 while(m--) 17 { 18 int i=2; 19 scanf("%d",&a); 20 k=a; 21 while(a%t!=0) 22 { 23 a=k*i; 24 i++; 25 } 26 t=a; 27 } 28 printf("%d ",a); 29 } 30 } 31 return 0; 32 }
这题可以找出里面最大的正整数,再进行翻倍找最小公倍数。
1 #include <iostream> 2 #include <cstdio> 3 4 using namespace std; 5 6 int main() 7 { 8 int t,n,i,num[100010]; 9 while(~scanf("%d",&t)&& t) 10 { 11 while(t--) 12 { 13 int lcm,max_num=0; 14 scanf("%d",&n); 15 for(i=1;i<=n;i++) 16 { 17 scanf("%d",&num[i]); 18 if(num[i]>max_num) max_num=num[i]; 19 } 20 21 lcm=max_num; 22 for(i=1;i<=n;i++) 23 while(lcm%num[i]!=0) 24 lcm+=max_num; 25 printf("%d ",lcm); 26 } 27 } 28 return 0; 29 }
不过这个代码提交似乎会WA,目前原因未知。