2021-04-28 20:17阅读: 82评论: 0推荐: 0

2021-04-28

天梯赛练习——L1-009 N个数求和

输入格式:

输入第一行给出一个正整数N(≤100)。随后一行按格式a1/b1 a2/b2 ...给出N个有理数。题目保证所有分子和分母都在长整型范围内。另外,负数的符号一定出现在分子前面。

输出格式:

输出上述数字和的最简形式 —— 即将结果写成整数部分 分数部分,其中分数部分写成分子/分母,要求分子小于分母,且它们没有公因子。如果结果的整数部分为0,则只输出分数部分。

输入样例1:

5
2/5 4/15 1/30 -2/60 8/3

输出样例1:

3 1/3

输入样例2:

2
4/3 2/3

输出样例2:

2

输入样例3:

3
1/3 -1/6 1/8

输出样例3:

7/24

#include<iostream>
#include<cmath>
using namespace std;
int zdgys(int x,int y)
{
    if(y==0) return x;
    return zdgys(y,x%y);
}
int main()
{
    int n;
    cin>>n;
    int a[n],b[n];
    for(int i=0;i<n;i++){
        scanf("%d/%d",&a[i],&b[i]);
    }
    int ta=a[0],tb=b[0];
    int t = zdgys(abs(a[0]), abs(b[0]));
    ta /= t;
    tb /= t;

    for(int i=1;i<n;i++){
        if(ta){
            t = zdgys(abs(tb), abs(b[i]));
            ta = ta * (b[i] / t);
            a[i] = a[i] * (tb / t);
            ta = ta + a[i];
            tb = tb / t* b[i] ;
        }
        else{
            ta = a[i];
            tb = b[i];
        }
        t = zdgys(abs(ta), abs(tb));
        ta /= t;
        tb /= t;

    }


    t = ta / tb;
    ta = ta % tb;
    if(t&&ta){
        printf("%d %d/%d", t, abs(ta), abs(tb));
    }
    else if(!ta){
            printf("%d", t);
    }
    else
        printf("%d/%d" ,ta, abs(tb));
    return 0;
}

算法

1、将分子分母分别存在两个数组中,从第一个数开始依次开始加数。

2、两个分数相加用辗转相除法求出两个分母的最大公因数,分子通分后相加。

3、分情况输出

构建测试用例

构建测试用例覆盖所有可能

一、正数

1、带分数

2、正整数

3、真分数

二、负数

1、带分数

2、负整数

3、真分数

三、0

四、N=1的边界情况

 

 

本文作者:TTMoon

本文链接:https://www.cnblogs.com/shen75/p/18140210

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   TTMoon  阅读(82)  评论(0编辑  收藏  举报  
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑