有一系列正整数,求它们的最大公约数和最小公倍数,原始正整数和最终结果都在32位正整数范围内。
输入格式:
数据有多组,每组数据占一行,第1个数代表本组数据正整数个数,正整数个数至少为1。
输出格式:
针对每组输入数据,输出数据占一行,含最大公约数和最小公倍数,中间以一个空格分隔。
输入样例:
2 6 8
4 6 8 12 20
1 15
6 5 12 12 30 46 10
输出样例:
2 24
2 120
15 15
1 1380
示例:
#include<stdio.h>
#include<stdlib.h>
int gcd(int a, int b)
{
int temp;
if (a<b){
temp = a;
a = b;
b = temp;
}
if(b == 0) { return a; }
return gcd(b,a%b);
}
int lcm(int a, int b)
{
return (a*b / gcd(a,b));
}
int ngcd(int max[], int n)
{
int a = max[0];
int b = max[1];
int c = gcd(a, b);
for (int i = 2; i<n; i++){
c = gcd(c, max[i]);
}
return c;
}
int nlcm(int min[], int n)
{
int a = min[0];
int b = min[1];
int c = lcm(a, b);
for (int i = 2; i<n; i++){
c = lcm(c, min[i]);
}
return c;
}
int main()
{
int *a = NULL;
int i = 0;
int j = 0;
while(scanf("%d", &j) != EOF){
a = (int *)malloc(sizeof(int) * j);
for (i; i < j; i++){
scanf("%d", &a[i]);
}
if(j==1)
{
printf("%d %d\n",a[0],a[0]);
break;
}
printf("%d %d\n", ngcd(a, j),nlcm(a, j));
}
}