杭电2028 Lowest Common Multiple Plus (辗转相除)最优?

本文记录了博主初次参加ACM竞赛的经历,并分享了一道使用辗转相除法解决的问题。通过此题,博主总结出了在面对整数运算溢出时的解决方案,并反思了代码调试的重要性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

刚开通博客,这算是第一篇文章吧。为什么要开通博客呢?因为这题虽然是水题,但我交了2次都wa了。(吸取教训)其实你可以暴力解出来。但我用辗转相除,这是我个人想出来的最优解了。。。我测试了好几组数据都是可以的,但wa两次让我怀疑人生。其实就是辗转相乘的时候两数相乘会超过 int 的最大界限,所以是先除。。。

不过刚开始ACM,还是吸取教训为主。我个人比较追求最优。。如果这题还有什么优化的话,还请各位指点一下。。

http://acm.hdu.edu.cn/showproblem.php?pid=2028 题目地址

代码如下(纯属原创)

#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<math.h>
int get_fun(int m,int n)
{
    int t,m1,n1;
    m1=m,n1=n;
    while(n){
        t = n;
        n = m%n;
        m = t;
    }
    return m1/t*n1;
}
int main()
{
     int n,i,f,j;
     int a[3];
     while(scanf("%d",&n)!=EOF){
         f = 0;
        for(i=0;i<n;i++){
                if(i&&f){
                    j=0;
                scanf("%d",&a[j]);
                }
                else{
                    j = i;
                    scanf("%d",&a[j]);
                }
            if(i>0){
                    if(!j) j++;
                a[j]=get_fun(a[j],a[j-1]);
                f=1;
            }
        }
        if(n==0) a[j]=0;
         printf("%d\n",a[j]);
     }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值