1034 有理数四则运算

这是一种套路题,要先记住大体流程,然后反复练习。

1.分数的表示。

struct Fraction {
long long up,down;//up表示分子,down表示分母
};

规定:

第一点,先使分母非负数,如果分数是负,那么令分子是负的

第二点,如果分数是零,那么令分子是0,分母是1.

第三点,化简分数。

2.分数的化简。

第一点,如果分母为负,那么分子分母取反。

第二点,如果分数是零,那么令分子是0,分母是1.

第三点,求出分子和分母它们绝对值的最大公约数d。然后分子分母除以d。

3.分数的四则运算。

就是数学上分数的一般计算过程。写成四个不同的函数即可,记得返回的结果化简

4.分数的输出。

第一点,如果分子能被分母整除,就输出整除后的结果,即输出一个整数。

第二点,如果分子的绝对值大于分母,说明这是一个假分数,先输出一个整数,再输出一个正分数。

第三点,一二两点均不满足,说明是一个真分数,直接输出。

#include"cstdio"
#include"algorithm"
using namespace std;
//分数存储结构
struct Fraction {
    long long up,down;//up表示分子,down表示分母
};
//求最大公约数
long long gcd(long long a,long long b) {
    return     b == 0?a:gcd(b,a%b);
}
//化简分数
Fraction Reduction(Fraction a) {
    if(a.down < 0) {//分母是负数,分子分母取反
        a.up = -a.up;
        a.down = -a.down;
    }
    if(a.up == 0) a.down = 1;//分数是0
    else {
        long long t = gcd(abs(a.up),abs(a.down));
        a.up/=t;
        a.down/=t;
    }
    return a;
}
//分数加法
Fraction add(Fraction a,Fraction b) {
    Fraction c;
    c.up = a.up*b.down+b.up*a.down;
    c.down = a.down*b.down;
    return Reduction(c);//结果化简
}
//分数减法
Fraction sub(Fraction a,Fraction b) {
    Fraction c;
    c.up = a.up*b.down- b.up*a.down;
    c.down = a.down*b.down;
    return Reduction(c);//结果化简
}
//分数乘法
Fraction multi(Fraction a,Fraction b) {
    Fraction c;
    c.up = a.up*b.up;
    c.down = a.down*b.down;
    return Reduction(c);//结果化简
}
//分数除法。
Fraction divide(Fraction a,Fraction b) {
    Fraction c;
    c.up = a.up*b.down;
    c.down = a.down*b.up;//注意除数分子b.up为0的情况
    return  Reduction(c) ;//结果化简
}

//输出分数
void print(Fraction a) {
    a = Reduction(a);
    if(a.up < 0) printf("(");
    if(a.down == 1) printf("%lld",a.up);
    else if(abs(a.up)>a.down)
        printf("%lld %lld/%lld",a.up/a.down,abs(a.up)%a.down,a.down);
    else {
        printf("%lld/%lld",a.up,a.down);
    }
    if(a.up < 0) printf(")");
}

int main() {
    Fraction a,b;
    scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);
    //分数加法
    print(a);
    printf(" + ");
    print(b);
    printf(" = ");
    print(add(a,b));
    printf("\n");
    //分数减法
    print(a);
    printf(" - ");
    print(b);
    printf(" = ");
    print(sub(a,b));
    printf("\n");
    //分数乘法
    print(a);
    printf(" * ");
    print(b);
    printf(" = ");
    print(multi(a,b));
    printf("\n");
    //分数除法
    print(a);
    printf(" / ");
    print(b);
    printf(" = ");
    if(b.up == 0) printf("Inf");//除数是0,特判输出
    else print(divide(a,b));
    return 0;
}

 

posted @ 2020-02-13 22:37  tangq123  阅读(170)  评论(0编辑  收藏  举报