两个整数公有的倍数称为它们的公倍数,其中最小的一个正整数称为它们两个的最小公倍数。当然,n个数也可以有最小公倍数,例如:5,7,15的最小公倍数是105。
输入n个数,请计算它们的最小公倍数。
输入格式:
首先输入一个正整数T,表示测试数据的组数,然后是T组测试数据。
每组测试先输入一个整数n(2≤n≤20),再输入n个正整数(属于[1,100000]范围内)。这里保证最终的结果在int型范围内。
输出格式:
对于每组测试,输出n个整数的最小公倍数。
输入样例:
4
3 5 7 15
5 1 2 4 3 5
8 7 15 12 3 4 6 4 9
2 45000 50000
输出样例:
105
60
1260
450000
解题思路:
求多个数的最小公倍数,其实就是,首先求出第一个数和第二数的最小公倍数,然后用这个公倍数和第三数求最小公倍数,以此类推,知道这一组的第n个数结束,也就是这一组n个数的最小公倍数。
而最小公倍数的实现是根据最小公倍数的定义,最小公倍数等于两数之积除以最大公约数。
所以本次解题中使用三个自定义函数, lcm_array( )、lcm()、gcd(),其中lcm_array( )用来实现一组数字的最小公倍数,lcm()是求两个数的最小公倍数,gcd()是求两个数的最大公约数。
详细步骤如下:
第一、首先将每组输入的n个整数都存入数组arr[ ]中。
第二、利用函数lcm_array函数计算n个整数的最小公倍数。
// 定义一个函数用于计算多个整数的最小公倍数
int lcm_array(int* arr, int n)
{
int res = arr[0]; // 定义一个变量用于保存最小公倍数
// 循环遍历数组中的每个元素
for (int i = 1; i < n; i++)
{
// 计算当前元素和之前元素的最小公倍数,并保存到res中
res = lcm(res, arr[i]);
}
return res;
}
第三、在 lcm_array函数中调用了lcm函数来计算两个数之间的最小公倍数。
// 定义一个函数用于计算两个数的最小公倍数
int lcm(int a, int b)
{
// 计算a和b的最大公约数
int gcd_val = gcd(a, b);
// 根据最小公倍数的定义,最小公倍数等于两数之积除以最大公约数
return (a / gcd_val) * b;
}
第四、在lcm函数中又调用了gcd_val函数来计算两个数的最大公约数。
// 定义一个函数用于计算两个数的最大公约数
int gcd(int a, int b)
{
// 判断b是否为0,若为0则返回a,即为最大公约数
if (b == 0)
return a;
else
{
// 若b不为0,则递归调用gcd函数,传入a和b的余数
return gcd(b, a % b);
}
}
完整代码
#include <stdio.h>
// 定义一个函数用于计算两个数的最大公约数
int gcd(int a, int b)
{
// 判断b是否为0,若为0则返回a,即为最大公约数
if (b == 0)
return a;
else
{
// 若b不为0,则递归调用gcd函数,传入a和b的余数
return gcd(b, a % b);
}
}
// 定义一个函数用于计算两个数的最小公倍数
int lcm(int a, int b)
{
// 计算a和b的最大公约数
int gcd_val = gcd(a, b);
// 根据最小公倍数的定义,最小公倍数等于两数之积除以最大公约数
return (a / gcd_val) * b;
}
// 定义一个函数用于计算多个整数的最小公倍数
int lcm_array(int* arr, int n)
{
int res = arr[0]; // 定义一个变量用于保存最小公倍数
// 循环遍历数组中的每个元素
for (int i = 1; i < n; i++)
{
// 计算当前元素和之前元素的最小公倍数,并保存到res中
res = lcm(res, arr[i]);
}
return res;
}
int main() {
// 定义一个变量用于记录测试数据的组数
int T = 0;
int i = 0;
int arr[10000] = { 0 };
scanf("%d", &T);
// 循环处理每组测试数据
while (T--) {
// 当前组测试数据的整数个数
int n;
scanf("%d", &n);
// 从标准输入中读入n个整数并保存到数组中
for (i = 0; i < n; i++)
{
scanf("%d", &arr[i]);
}
// 调用lcm_array函数计算n个整数的最小公倍数并输出到标准输出中
printf("%d\n", lcm_array(arr, n));
}
return 0;
}
代码实现结果和输出样例一致
最后说一说我的感想,其实这也是我第一次写这样的题,我也琢磨了好久,也挺费劲的,毕竟我也还是个小白,刚接触不久,感觉还有很长的路要走,不管怎么说,最终还是写出来了,还是觉得挺有收获的,如果你们看了觉得有帮助,那我就更加开心啦!
最后说一句,希望自己不忘初心,坚持下去,如果你们也是的话,点个小小的赞一起加油叭!