PAT乙级 有理数四则运算(求最大公约数值得学习)这题关键就是格式的处理

在这里插入图片描述

/*所有的加减乘除其实都很好计算  
这个题的难点在于输出格式的确定func函数用来确认输出格式
*/
#include<iostream>
#include<cmath>
using namespace std;
long long a,b,c,d;
//求最大公约数算法

void func(long long m,long long n);
long long gcd(long long t1, long long t2) {
    return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}


void func(long long m,long long n)
{
    if(m==0)
    {
        printf("0");
        return;
    }
    if(n==0)
    {
        printf("Inf");
        return;
    }
        
    //判断是否是负的(负的要带括号)  不能用相乘去判断 因为long long范围有限
    
    bool flag = ((m>0&&n<0)||(m<0&&n>0));
    //转换为正数 目的方便调整输出格式
    m=abs(m);
    n=abs(n);
    long long x = m/n;
    printf("%s",flag?"(-":"");
    if(x!=0) printf("%lld",x);
    if(m%n==0)//无余数 有余数要考虑生成新的分数前提是还要输出带分数的前面那一位
    {
      if(flag) printf(")");
      return;
    } 
    if(x!=0)
        printf(" ");
    m=m-x*n;
    //最后输出之前要判断化简是否
    long long t = gcd(m,n);
    m=m/t;n=n/t;
    printf("%lld/%lld%s",m,n,flag?")":"");
    
    
    
}
int main(){
    scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
    func(a,b);printf(" + ");func(c,d);printf(" = ");func(a*d+b*c,b*d);printf("\n");
    func(a,b);printf(" - ");func(c,d);printf(" = ");func(a*d-b*c,b*d);printf("\n");
    func(a,b);printf(" * ");func(c,d);printf(" = ");func(a*c,b*d);printf("\n");
    func(a,b);printf(" / ");func(c,d);printf(" = ");func(a*d,b*c);printf("\n");
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值