本代码片参考了网络上各种大神的代码,如有侵权,请联系我第一时间撤下
/*
要点:1、在计算最小公倍数的时候 要先除后乘 因为有可能两数相乘超出int
2、在第一次传递数据的时候,数组传过去的是地址,这样方便支线函数随时调用数组数据
3、英语水平尽量提高,题目描述和各个数据代表的含义一定要搞明白
*/
#include <stdio.h>
int getGCD(int a,int b);
int doLCM(int*array,int size);
int main(void) {
int n;
scanf("%d",&n); //输入一共有几组数据
while(n--) { //当n=0 的时候结束循环
int array[9999]; //定义一个数组 用来存放数据
int x; //定义每一组数据 有多少个数
scanf("%d",&x);
for(int i=0; i<x; i++) //输入数据
scanf("%d",&array[i]);
int result = doLCM(array,x); //调用最小公倍数函数 将数组地址、数据数量 传入
printf("%d\n",result);
}
return 0;
}
//最小公倍数函数
int doLCM(int* array,int size) {
//接受主函数传入的数组地址、数据数量 (*表示类型为地址)
int x,y,num=array[0],i,gcd;
for(i=0; (i+1)<size; i++) {//每两个数两个数求最小公倍数 循环进行x-1次
x=num;
y=array[i+1];
gcd = getGCD(x,y);//求最大公约数
num = x/gcd * y ;
//求法:两数相乘除以最大公约数则为最小公倍数 num则为两两的最小公倍数
}
return num;
}
//最大公约数函数
int getGCD(int a,int b) {
int temp;
if(a < b) {//必须要保证A>B
temp = a;
a = b;
b = temp;
}
if(a%b == 0) {
//辗转相除法 若a/b余数为0 则b为最大公约数,若不为零,则将a,b中的小数与余数继续求余数 直到为零
return b;
} else {
return getGCD(b,a%b);
}
}