• 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;   
    }
  • 相关阅读:
    PCL利用RANSAC自行拟合分割平面
    HDU 3062 && HDU 1824 && POJ 3678 && BZOJ 1997 2-SAT
    BZOJ 3670 && BZOJ 3620 && BZOJ 3942 KMP
    BZOJ 1500 Splay 全操作
    Manacher
    POJ 2155 2维线段树 || 2维BIT
    BZOJ 1015 并查集+离线倒序
    NOI Linux JAVA
    UVA 10407 差分思想的运用
    BZOJ 1969 树链剖分+Tarjan缩点
  • 原文地址:https://www.cnblogs.com/Dancing-Fairy/p/12659721.html
Copyright © 2020-2023  润新知