浙大PAT甲级 1088

考虑的情况比较多:

(1) 除数为0则,则等号后面输出inf。

(2)求最小公倍数时,两数相乘的范围可能超过了int所表示的范围,因此应选用long long 类型。

AC代码:

#include<iostream>
#include<map>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
#include<list>
#include<set>
#include<stack>
#include<cmath>
#include<vector>
#define ll long long
#define inf 999999999
using namespace std;
ll gcd(ll x,ll y)
{
    return x%y==0?y:gcd(y,x%y);
}
ll f(ll x,ll y)
{
  return x*y/gcd(x,y);
}
void print(ll x,ll y)
{
    if(y<0)
    {
        x=-x;
        y=-y;
    }
    if(x==0)
    {
        printf("0");
    }
    else if(x>0)
    {
        ll r=gcd(x,y);
        x/=r;
        y/=r;
        if(y==1)
        {
            printf("%lld",x);
            return;
        }
        if(x/y==0)
        {
            printf("%lld/%lld",x,y);
        }
        else
        {
            ll d=x/y;
            printf("%lld %lld/%lld",d,x-d*y,y);
        }
    }
    else
    {
        printf("(-");
        x=-x;
        ll r=gcd(x,y);
        x/=r;
        y/=r;
        if(y==1)
        {
            printf("%lld)",x);
            return;
        }
        if(x/y==0)
        {
            printf("%lld/%lld",x,y);
        }
        else
        {
            ll d=x/y;
            printf("%lld %lld/%lld",d,x-d*y,y);
        }
        printf(")");
    }
}
int main()
{
    string s1;
    string s2;
    cin>>s1>>s2;
    int flag1=0;
    if(s1[0]=='-')
    {
        flag1=1;
        s1.erase(0,1);
    }
    int flag2=0;
    if(s2[0]=='-')
    {
        flag2=1;
        s2.erase(0,1);
    }
    ll mark1;
    ll mark2;
    ll sum=0;
    ll fenzi1;
    ll fenmu1;
    ll fenzi2;
    ll fenmu2;
    for(ll i=0;i<s1.size();i++)
    {
        if(s1[i]=='/')
        {
            mark1=i;
            break;
        }
        sum*=10;
        sum+=s1[i]-'0';
    }
    fenzi1=flag1==1?-sum:sum;
    sum=0;
    for(ll i=mark1+1;i<s1.size();i++)
    {
        sum*=10;
        sum+=s1[i]-'0';
    }
    fenmu1=sum;
    if(fenzi1==0)
    {
        fenmu1=1;
    }
    sum=0;
    for(ll i=0;i<s2.size();i++)
    {
        if(s2[i]=='/')
        {
            mark2=i;
            break;
        }
        sum*=10;
        sum+=s2[i]-'0';
    }
    fenzi2=flag2==1?-sum:sum;
    sum=0;
    for(ll i=mark2+1;i<s2.size();i++)
    {
        sum*=10;
        sum+=s2[i]-'0';
    }
    fenmu2=sum;
    if(fenzi2==0)
    {
        fenmu2=1;
    }
    ll fz1=fenzi1;
    ll fm1=fenmu1;
    ll fz2=fenzi2;
    ll fm2=fenmu2;
    print(fenzi1,fenmu1);
    printf(" + ");
    print(fenzi2,fenmu2);
    printf(" = ");
    ll h=f(fenmu1,fenmu2);
    fenzi1=h/fenmu1*fenzi1;
    fenzi2=h/fenmu2*fenzi2;
    ll fenmu=h;
    ll fenzi=fenzi1+fenzi2;
    print(fenzi,fenmu);
    printf("\n");
    fenzi1=fz1;
    fenzi2=fz2;
    fenmu1=fm1;
    fenmu2=fm2;
    print(fenzi1,fenmu1);
    printf(" - ");
    print(fenzi2,fenmu2);
    printf(" = ");
     h=f(fenmu1,fenmu2);
    fenzi1=h/fenmu1*fenzi1;
    fenzi2=h/fenmu2*fenzi2;
     fenmu=h;
     fenzi=fenzi1-fenzi2;
    print(fenzi,fenmu);
    printf("\n");
 fenzi1=fz1;
    fenzi2=fz2;
    fenmu1=fm1;
    fenmu2=fm2;

    print(fenzi1,fenmu1);
    printf(" * ");
    print(fenzi2,fenmu2);
    printf(" = ");
     fenmu=fenmu1*fenmu2;
     fenzi=fenzi1*fenzi2;
    print(fenzi,fenmu);
    printf("\n");

     fenzi1=fz1;
    fenzi2=fz2;
    fenmu1=fm1;
    fenmu2=fm2;
    print(fenzi1,fenmu1);
    printf(" / ");
    print(fenzi2,fenmu2);
    printf(" = ");
    if(fenzi2==0)
    {
        printf("Inf\n");
        return 0;
    }
     fenmu=fenmu1*fenzi2;
     fenzi=fenzi1*fenmu2;
    print(fenzi,fenmu);
    printf("\n");

}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值