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

在这里插入图片描述
在这里插入图片描述
这道题想了好久,一晚上加一早上,第三个点愣是没过,查阅众多博客,不是改为long long就是负负得正,但是改了后第三个还是答案错误,最后想了一下是不是相乘溢出的原因,然后在乘法和除法的前面加上约分:代码如下

long long gcd=__gcd(m1,d1);//求公约数
    if(gcd!=1){
        m1/=gcd;
        d1/=gcd;
    }
    gcd=__gcd(m2,d2);//求公约数
    if(gcd!=1){
        m2/=gcd;
        d2/=gcd;
    }

没想到居然真的过了:正确代码如下:

#include<bits/stdc++.h>

using namespace std;
long long m1,d1;
long long m2,d2;

// 打印分数
void printGrade(long long a,long long b){//a为分子,b为分母
    bool flag=false;
//     cout<<endl<<a<<b<<endl;
    if(a<0){
        if(b<0){
            a=-a;
            b=-b;
        }else{
            cout<<"(-";
            a=-a;
            flag=true;
        }
        
    }else{
        if(b<0){
            cout<<"(-";
            b=-b;
            flag=true;
        }
    }
    long long gcd=__gcd(a,b);//求公约数
    if(gcd!=1){
        a/=gcd;
        b/=gcd;
    }
    if(a==0){//分子为0
        cout<<0;
        return;
    }else if(b==1){
        cout<<a;
        if(flag)cout<<')';
        return;
    }else if(b==0){
        cout<<"Inf";
        return;
    }else if(a==b){
        cout<<a/b;
        if(flag)cout<<')';
        return;
    }else if(a>b){
        cout<<(a/b)<<' '<<(a%b)<<'/'<<b;
        if(flag)cout<<')';
        return;
    }else{
        if(flag){
            cout<<a<<'/'<<b<<")";
        }else
            cout<<a<<'/'<<b;
    }
}
//分数相加
void add(){
    long long temp=m1+m2;
    printGrade(temp,d1);
//     cout<<"*"<<temp<<d1;
}

//分数相减
void sub(){
    long long temp=m1-m2;
    printGrade(temp,d1);
}

//分数相乘
void mul(){
    long long tempM=m1*m2;
    long long tempD=d1*d2;
    printGrade(tempM,tempD);
}

//分数相除
void div(){
    if(m2==0){//考虑倒数的分母为0的情况
        cout<<"Inf";
        return;
    }
    if(m2<0){
        m2=-m2;
        d2=-d2;
    }
    long long tempM=m1*d2;
    long long tempD=d1*m2;
    printGrade(tempM,tempD);
}


int main(){
    scanf("%lld/%lld%lld/%lld",&m1,&d1,&m2,&d2);
    m1*=d2;
    m2*=d1;
    d1*=d2;
    d2=d1;
    
    printGrade(m1,d1);
    cout<<" + ";
    printGrade(m2,d2);
    cout<<" = ";
    add();
    cout<<endl;
    
    printGrade(m1,d1);
    cout<<" - ";
    printGrade(m2,d2);
    cout<<" = ";
    sub();
    cout<<endl;
    
    long long gcd=__gcd(m1,d1);//求公约数
    if(gcd!=1){
        m1/=gcd;
        d1/=gcd;
    }
    gcd=__gcd(m2,d2);//求公约数
    if(gcd!=1){
        m2/=gcd;
        d2/=gcd;
    }
    printGrade(m1,d1);
    cout<<" * ";
    printGrade(m2,d2);
    cout<<" = ";
    mul();
    cout<<endl;
    
    printGrade(m1,d1);
    cout<<" / ";
    printGrade(m2,d2);
    cout<<" = ";
    div();
    cout<<endl;
    return 0;
}

总结可能原因:因为我在运算前通了分,然后导致分子或分母超过了整数范围,乘法或除法再相乘的结果是可能会大于long long的最大值的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值