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

注意点,数据类型用long,判断分数小于0不要用a*b<0,要用(a>0&&b<0)||(a<0&&b>0),否则会溢出

#include<cstdio>
#include<vector>
#include<cstring>
#include<iostream>
using namespace std;
long gcd(long a,long b){
    if(b==0)return a;
    return gcd(b,a%b);
}
string func(long a, long b){
    string str="";
    bool flag=false;
    if(b==0){
        str=str+"Inf";
        return str;
    }
    if((a<0&&b>0)||(a>0&&b<0)){
        flag=true;
        str+='(';
    }
    if(a==0)
        str+='0';
    else{
        if(flag)str+='-';
        if(a/b*b==a){
            str+=to_string(abs(a/b));
        }
        else{
            int z=a/b;
            a=a-z*b;
            if(z!=0){
                str+=to_string(abs(z));
                str+=' ';
            }
            long k=gcd(abs(a),abs(b));
            str+=to_string(abs(a)/k);
            str+='/';
            str+=to_string(abs(b)/k);
        }
    }
    if(flag)str+=')';
    return str;
}
int main(){
    long a,b,c,d;
    scanf("%ld/%ld %ld/%ld",&a,&b,&c,&d);
    bool flag1=true,flag2=true;
    string s1=func(a,b);
    string s2=func(c,d);
    char cal[4]={'+','-','*','/'};
    long ans1[4]={0};
    long ans2[4]={0};
    for(int i=0;i<4;i++){
        switch(cal[i]){
            case '+':{
                ans1[i]=a*d+b*c;
                ans2[i]=b*d;
                break;
            }
            case '-':{
                ans1[i]=a*d-b*c;
                ans2[i]=b*d;
                break;
            }
            case '*':{
                ans1[i]=a*c;
                ans2[i]=b*d;
                break;
            }
            case '/':{
                ans1[i]=a*d;
                ans2[i]=b*c;
                break;
            }
            default:break;
        }
        string s=func(ans1[i],ans2[i]);
        cout<<s1;
        printf(" %c ",cal[i]);
        cout<<s2;
        printf(" = ");
        cout<<s<<endl;
    }
    return 0;   
}
原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12659721.html