(PTA)7-3 多个数的最小公倍数

两个整数公有的倍数称为它们的公倍数,其中最小的一个正整数称为它们两个的最小公倍数。当然,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;
}

代码实现结果和输出样例一致

最后说一说我的感想,其实这也是我第一次写这样的题,我也琢磨了好久,也挺费劲的,毕竟我也还是个小白,刚接触不久,感觉还有很长的路要走,不管怎么说,最终还是写出来了,还是觉得挺有收获的,如果你们看了觉得有帮助,那我就更加开心啦!

最后说一句,希望自己不忘初心,坚持下去,如果你们也是的话,点个小小的赞一起加油叭!

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值