L1-009 N个数求和

2021.7.14

今天遇到的第一道有点意思的题

题目不难,难的是考虑情况全面...(就因为这个耗了一上午,不过还是有收获)

#include<stdio.h>
#include<stdlib.h>
long gcd(long a,long b)
{
    return b == 0 ? a : gcd(b,a % b);//这种方法更优
}

int main()
{
    long n,a,b,c=0,d=1;//题目给出范围为长整型
    scanf("%ld",&n);
    for(int i=1; i<=n; i++)
    {
        scanf("%ld/%ld",&a,&b);
        c=c*b+d*a;
        d*=b;
        int g;
        g=abs(gcd(c,d));//取绝对值,防止变号,变号后处理麻烦
        c/=g;//防止溢出
        d/=g;//防止溢出
    }//不用开二维数组和第二次求和,更加简洁,以后碰到连加连乘都应该用这个,今天脑子抽了
    if(c<0)
    {
    putchar('-');//小于0时,必定可以输出
    c=-c;
    }
    long p;
    p=c/d;
    long z;
    z=c%d;
    if(p||!c)//整数部分非0,加"\\!c"是考虑到和为0的情况
    {
        printf("%ld",p);
    }
    if(p!=0&&z!=0)
    {
    printf(" ");
    }
    if(z!=0)
    {
    printf("%ld/%ld",z,d);
    }
}

这次主要收获还是在这段代码上

long gcd(long a,long b)
{
    return b == 0 ? a : gcd(b,a % b);//这种方法更优
}

之前是这样敲的

int  gcd(int a,int b)
{
    int r,t;
    if(a<b)
    {
        t=a;
        a=b;
        b=t;
    }//这里其实没有必要加这一段,执行一次之后也会换过来
    while((r=a%b)!=0)//可能会出现除以0的情况,导致程序崩溃
    {
        a=b;
        b=r;
    }
    return b;
}

主要问题还是没考虑全面(1.部分分子为0  2.和值为0),而且本身自己之前的代码也有一些问题,好在做了题之后找了出来

参考了下面两位大佬,感谢两位

代码思路

https://www.cnblogs.com/8023spz/p/10604089.html

测试点

https://blog.csdn.net/qq_43073128/article/details/109301689?ops_request_misc=&request_id=&biz_id=102&utm_term=l1-009%E6%B5%8B%E8%AF%95%E7%82%B95&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-6-.first_rank_v2_pc_rank_v29&spm=1018.2226.3001.4187

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值