1

题目大意:

给定2个分数,求出这2个分数的四则运算结果。若为假分数,得按照带分数的方式进行输出,整数按照整数的形式输出,否则按照真分数进行输出。

算法思路:此题和1081思路是一样的,不过需要写出四则运算,具体步骤如下:
1.分数采用Fraction结构体存储,这里要求数据得是long long型
2.gcd函数求解两数的最大公约数,目的是为了后面的化简操作
3.分数的化简:满足2个原则

1)如果分母为负数,令分子和分母都变为相反数,保证负号在分子上。 
2)约分:求出分子绝对值和分母的最大公约数d,然后让分子和分母同时除以d 

4.分别使用add,sub,multi,div计算f1和f2的加减乘除,按照数学公式来就行,最后返回化简的结果,这里得注意如果b的分子为0,得将返回结果的分母设置为0,表示无穷大。
5.分数的输出规则:

1)如果分母为1,说明该分数为整数,输出分子即可 
2)如果分母为0,说明是无穷大,输出Inf 
3)如果分子的绝对值大于分母,说明是假分数,此时按照带分数的格式输出,即先输出 整数部分(分子除以分母),
分子(分子绝对值对分母求余数)/分母,这里得注意对于负数需要添加括号 
4)否则就是真分数,按照原样输出即可,对于负数得添加括号。
四则运算代码:
// 分数a和分数b的加法
Fraction add(Fraction a,Fraction b){
    Fraction r;
    r.denominator = a.denominator*b.denominator;
    r.numerator = a.denominator*b.numerator+a.numerator*b.denominator;
    return reduction(r);// 返回化简的结果
}

// 分数a和分数b的减法
Fraction sub(Fraction a,Fraction b){
    Fraction r;
    r.denominator = a.denominator*b.denominator;
    r.numerator = a.numerator*b.denominator-a.denominator*b.numerator;
    return reduction(r);// 返回化简的结果
}

// 分数a和分数b的乘法
Fraction multi(Fraction a,Fraction b){
    Fraction r;
    r.denominator = a.denominator*b.denominator;
    r.numerator = a.numerator*b.numerator;
    return reduction(r);// 返回化简的结果
}

// 分数a和分数b的除法
Fraction div(Fraction a,Fraction b){
    Fraction r;
    if(b.numerator==0){
        // 除数为0
        r.numerator = 0;
        r.denominator = 0;
        return r;
    }
    r.denominator = a.denominator*b.numerator;
    r.numerator = a.numerator*b.denominator;
    return reduction(r);// 返回化简的结果
}

提交结果:

image.png

AC代码:

#include <cstdio>
#include <algorithm>

using namespace std;

struct Fraction{
    long long numerator;// 分子
    long long denominator;// 分母
    // 默认分数为0
    Fraction(){
        numerator = 0;
        denominator = 1;
    }
};

// 求a和b的最大公约数
long long gcd(long long a,long long b){
    if(b==0) return a;
    else return gcd(b,a%b);
}

// 分数的化简
Fraction reduction(Fraction f){
    if(f.denominator<0) {
        // 分母为负数,将分母和分子都取反
        f.numerator = -f.numerator;
        f.denominator = -f.denominator;
    }
    // 获得分子分母的最大公约数
    long long d = gcd(abs(f.numerator),f.denominator);
    // 约分
    f.denominator /= d;
    f.numerator /= d;
    return f;
}

// 分数a和分数b的加法
Fraction add(Fraction a,Fraction b){
    Fraction r;
    r.denominator = a.denominator*b.denominator;
    r.numerator = a.denominator*b.numerator+a.numerator*b.denominator;
    return reduction(r);// 返回化简的结果
}

// 分数a和分数b的减法
Fraction sub(Fraction a,Fraction b){
    Fraction r;
    r.denominator = a.denominator*b.denominator;
    r.numerator = a.numerator*b.denominator-a.denominator*b.numerator;
    return reduction(r);// 返回化简的结果
}

// 分数a和分数b的乘法
Fraction multi(Fraction a,Fraction b){
    Fraction r;
    r.denominator = a.denominator*b.denominator;
    r.numerator = a.numerator*b.numerator;
    return reduction(r);// 返回化简的结果
}

// 分数a和分数b的除法
Fraction div(Fraction a,Fraction b){
    Fraction r;
    if(b.numerator==0){
        // 除数为0
        r.numerator = 0;
        r.denominator = 0;
        return r;
    }
    r.denominator = a.denominator*b.numerator;
    r.numerator = a.numerator*b.denominator;
    return reduction(r);// 返回化简的结果
}

// 分数的输出
void print(Fraction f){
    if(f.denominator==1){
        // 整数,输出分子即可
        if(f.numerator>=0){
            printf("%lld",f.numerator);
        } else {
            printf("(%lld)",f.numerator);
        }
    } else if(f.denominator==0){
        // 无穷大
        printf("Inf");
    } else {
        if(abs(f.numerator)>f.denominator){
            // 假分数
            if(f.numerator>=0){
                printf("%lld %lld/%lld",f.numerator/f.denominator,abs(f.numerator)%f.denominator,f.denominator);
            } else {
                printf("(%lld %lld/%lld)",f.numerator/f.denominator,abs(f.numerator)%f.denominator,f.denominator);
            }
        } else {
            // 真分数
            if(f.numerator>=0){
                printf("%lld/%lld",f.numerator,f.denominator);
            } else {
                printf("(%lld/%lld)",f.numerator,f.denominator);
            }
        }
    }
}

// 输出a与b的四则运算
void printAll(Fraction a,Fraction b){
    for (int num = 0; num < 4; ++num) {//0代表加法,1代表减法,2代表乘法,3代表除法
        print(a);
        switch (num){
            case 0:printf(" + ");
                break;
            case 1:printf(" - ");
                break;
            case 2:printf(" * ");
                break;
            case 3:printf(" / ");
                break;
            default:
                break;
        }
        print(b);
        printf(" = ");
        switch (num){
            case 0:print(add(a,b));
                break;
            case 1:print(sub(a,b));
                break;
            case 2:print(multi(a,b));
                break;
            case 3:print(div(a,b));
                break;
            default:
                break;
        }
        printf("\n");
    }
}

int main(){
    Fraction a,b;
    scanf("%lld/%lld %lld/%lld",&a.numerator,&a.denominator,&b.numerator,&b.denominator);
    printAll(reduction(a),reduction(b));

    return 0;
}

乔梓鑫
569 声望17 粉丝

主要分享个人学习经验和心得