PAT A1081 Rational Sum (20) [分数的四则运算]

题目

题目链接
求几个分数的和

解题思路

1 分数存储
2 分数化简
3 分数打印
4 分数运算-加

易错点

1 分数化简中,分子为0,分母要记得置为1
2 加和之后记得化简
3 最大公约数的计算使用分子分母绝对值计算,如果最大公约数为负数,化简后格式又不满足符号在分子的要求了
4 假分数的判定为分子绝对值大于分母,因为符号在分子上

单词语法

denominator 分母
numerator 分子
range 范围
rational numbers 有理数
rational 理性的;合理的

Code

Code 01

#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
// 分数存储
struct Fraction {
    int u;//up
    int d;//down
};

// 最大公约数
int gcd(int a, int b) {
    if(b==0)return abs(a);
    else return gcd(b,a%b);
}
// 分数化简
Fraction reduction(Fraction fra) {
    if(fra.d<0) {
        // 分母小于0,分子分母同时变号
        fra.d*=-1;
        fra.u*=-1;
    }
    if(fra.u==0) {
        //分子为0,分母置为1
        fra.d=1;
    } else {
        // 有公约数,消去公约数
        int gc = gcd(abs(fra.d),abs(fra.u));
        fra.u/=gc;
        fra.d/=gc;
    }
    return fra;
}
// 分数打印
void show(Fraction fra) {
    //化简
    fra = reduction(fra);
    //若分母为1,直接打印分子
    if(fra.d==1)printf("%d",fra.u);
    // 若为假分数,打印整数+真分数
    else if(abs(fra.u)>fra.d) {
        printf("%d %d/%d", fra.u/fra.d, abs(fra.u)%fra.d, fra.d);
    }else {
        printf("%d/%d", fra.u, fra.d);
    }
}
// 分数相加 
Fraction add(Fraction a, Fraction b) {
    Fraction c;
    c.u = a.u*b.d+a.d*b.u;
    c.d = a.d*b.d;
    return reduction(c);
}
int main(int argc,char * argv[]) {
    int n;
    Fraction ans;
    scanf("%d",&n);
    for(int i=0; i<n; i++) {
        Fraction temp;
        scanf("%d/%d",&temp.u,&temp.d);
        if(i==0)ans=temp;
        else ans = add(ans,temp); 
    }
    show(ans);
    return 0;
}

Code 02

#include <iostream>
#include <cstdlib>
using namespace std;
long long gcd(long long a, long long b) {
    return b == 0 ? abs(a) : gcd(b, a % b);
}
int main() {
    long long n, a, b, suma = 0, sumb = 1, gcdvalue;
    scanf("%lld", &n);
    for(int i = 0; i < n; i++) {
        scanf("%lld/%lld", &a, &b);
        gcdvalue = gcd(a, b);
        a = a / gcdvalue;
        b = b / gcdvalue;
        suma = a * sumb + suma * b;
        sumb = b * sumb;
        gcdvalue = gcd(suma, sumb);
        sumb = sumb / gcdvalue;
        suma = suma / gcdvalue;
    }
    long long integer = suma / sumb;
    suma = suma - (sumb * integer);
    if(integer != 0) {
        printf("%lld", integer);
        if(suma != 0) printf(" ");
    }
    if(suma != 0)
        printf("%lld/%lld", suma, sumb);
    if(integer == 0 && suma == 0)
        printf("0");
    return 0;
}

原文链接: https://www.cnblogs.com/houzm/p/13339014.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍;

也有高质量的技术群,里面有嵌入式、搜广推等BAT大佬

    PAT A1081 Rational Sum (20) [分数的四则运算]

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/368432

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年3月2日 下午6:24
下一篇 2023年3月2日 下午6:25

相关推荐