杭电OJ2028 最小的公倍数之和C语言版

这篇博客介绍了如何运用数学规律和辗转相除法来高效地计算多个数的最小公倍数,避免了暴力枚举可能导致的时间效率低下问题。通过找到最大公因数并逐步计算每个数的最小公倍数,最终得出所有数的最小公倍数,这种方法既节省计算资源又提高了代码的优雅性。
摘要由CSDN通过智能技术生成

我们看到这一题最先想到的是什么方法??

我想十有八九想到的都是暴力枚举的方法:先把全部的数字相乘,再从1开始枚举一直到有一个最小的数可以整除所有的数字。但作为上进的程序员,我们肯定会不禁想:这是啥啊,怎么这么拉啊。
所以我们才在这里遇见,寻求不拉的方法

那么在这里,我介绍的是用数学规律的解法:
关键思路:
1:两个数的最小公倍数等于两个数的乘积再除与两个数的最大公因数
2:重复使用辗转相除法得到最大的公因数(注意大小的先后问题,若是小的在前则要交换,故要先判断大小)
3:多个数的最小公倍数可以利用前面两个数的最小公倍数与下一个数求最小公倍
数,如此直到最后一个数,便得到了多个数的最小公倍数

4:为了避免溢出,第一步不妨先用一个数除与最大公因数再乘于另一个数

#include<stdio.h>
int main()
{
    int n,inset,o,p;
    int temp,temp1;
    while(scanf("%d",&n)!=EOF)
    {
        scanf("%d",&temp);
        for(int i=0;i<n-1;i++)
        {
        scanf("%d",&temp1);
        if(temp<temp1)
         {
           inset=temp;
           temp=temp1;
           temp1=inset;
         }
            o=temp;p=temp1;
         while(o%p!=0)
          {
           inset=o%p;
           o=p;
           p=inset;
          }
           temp=temp/p*temp1;//避免了溢出
        }
        printf("%d\n",temp);
    }
    return 0;}
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值