1034 有理数四则运算 (20 分)(C++)

1034 有理数四则运算 (20 分)(C++)_第1张图片
1034 有理数四则运算 (20 分)(C++)_第2张图片

#include 
#include 
#include 

using namespace std;
long long a,b,c,d;
//求最大公约数的子函数(辗转相除法)
long long gcd(long long m,long long n){
    return n ? gcd(n,(m % n)) : m;
    //return n == 0 ? m : gcd(n,(m % n));
}

//化简分数式子的子函数
void func(long long m,long long n){
    
    //判断是否有0
    if(m * n == 0){
        //return m == 0 ? printf("0") : printf("inf"); void 没有返回值
        printf("%s",m == 0 ? "0" : "Inf");
        return;
    }
    //判断是否异号并标记
    int flag = 0;
    if((m < 0 && n > 0) || (m > 0 && n < 0)){
        flag = 1;
        printf("(-");
    }
    m = abs(m);n = abs(n); //判断完正负之后都考虑为正值
    //判断是真分数还是假分数
        //假分数,且能化简为一个整数
    long long x = m / n;
    if(x != 0)printf("%lld",x);
    if(m % n == 0){
        if(flag == 1)printf(")");
        return;
    }
        //真分数和假分数(已经取出前边整数)不能化简成一个整数的情况
    if(x != 0)printf(" ");
    m = m - x * n;    //取出整数后,分子要相应减小,使得分式变为真分数
    long long t = gcd(m,n); //t为最大公约数
    m = m / t;
    n = n / t;
    //输出  
    printf("%lld/%lld",m,n);
    if(flag == 1)printf(")");
    return;
}

int main(){
    //输入
//     cin >> a >>b>>c>>d;
    scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
//     cout<
//     cout<
    //调用并输出
    func(a,b);printf(" + ");func(c,d);printf(" = ");func(a * d + c * b,b * d);
    cout << endl;
    func(a,b);printf(" - ");func(c,d);printf(" = ");func(a * d - c * b,b * d);
    cout << endl;
    func(a,b);printf(" * ");func(c,d);printf(" = ");func(a * c,b * d);
    cout << endl;
    func(a,b);printf(" / ");func(c,d);printf(" = ");func(a * d,b * c);
    return 0;
}

你可能感兴趣的:(数据结构,PAT,算法,数据结构,c++)