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

这道题目应该很好理解,关键在于做法。
首先在于数据的取值范围,题目中只说明是整型,但没说多大,我因此有的样例点没有通过。
这道题需要使用long类型的数据格式。
话不多说,直接上代码。

//
//  main.cpp
//  1034 有理数四则运算 (20分)
//
//  Created by Zide Liu on 2020/1/22.
//  Copyright © 2020 Zide Liu. All rights reserved.
//

#include <iostream>
#include <string>
using namespace std;
long gcd(long a,long b){//辗转相除法
    return b?gcd(b,a%b):a;
}
    /*
可理解为
long gcd(long x,long y){
    int z=y;
    while(x%y){
        z=x%y;
        x=y;
        y=z;
    }
    return z;
}

    */

string print(long a,long b){
    long k1=gcd(a,b);
    a=a/k1;b=b/k1;
    if(a==0) return "0";
    string s;
    int judge=0;
    if(b<0){a=-a;b=-b;}
    if(a<0) {s.append("(-");a=-a;judge=1;}
    if(a>=b) s.append(to_string(a/b));
    if(a>=b&&a%b) s.insert(s.end(),' ');
    a=a%b;
    if(a){
        s.append(to_string(a));
        //s.append("/");
        s.insert(s.end(),'/');
        s.append(to_string(b));
    }
    if(judge) 
    //s.append(")");
    s.insert(s.end(),')');
    return s;
}
int main(){
    long a,b,c,d;
    scanf("%ld/%ld %ld/%ld",&a,&b,&c,&d);
    cout<<print(a,b)<<" + "<<print(c,d)<<" = "<<print(b*c+a*d,b*d)<<endl;
    cout<<print(a,b)<<" - "<<print(c,d)<<" = "<<print(a*d-b*c,b*d)<<endl;
    cout<<print(a,b)<<" * "<<print(c,d)<<" = "<<print(a*c,b*d)<<endl;
    b*c?cout<<print(a,b)<<" / "<<print(c,d)<<" = "<<print(a*d,b*c)<<endl:cout<<print(a,b)<<" / "<<print(c,d)<<" = Inf"<<endl;
    return 0;
}


相信看完代码你就明白了。
努力学习STL,会有不一样的风景

全部评论

相关推荐

Yushuu:你的确很厉害,但是有一个小问题:谁问你了?我的意思是,谁在意?我告诉你,根本没人问你,在我们之中0人问了你,我把所有问你的人都请来 party 了,到场人数是0个人,誰问你了?WHO ASKED?谁问汝矣?誰があなたに聞きましたか?누가 물어봤어?我爬上了珠穆朗玛峰也没找到谁问你了,我刚刚潜入了世界上最大的射电望远镜也没开到那个问你的人的盒,在找到谁问你之前我连癌症的解药都发明了出来,我开了最大距离渲染也没找到谁问你了我活在这个被辐射蹂躏了多年的破碎世界的坟墓里目睹全球核战争把人类文明毁灭也没见到谁问你了😆
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务