43.139.152.26 P2315 分数计算

从键盘读入一个分数算式,为2个分数做加法或者减法,请输出分数算式的结果,结果也用分数表达,且约分到最简形式。(请注意:做减法可能得到负的分数,如果是负数要输出负号-,如1/15-4/15结果为-1/5)(5.1.76)

输入格式

分数表达式(分数表达式中,每个分数的分子和分母都是正整数,两个分数中的运算符,可能是加号,也可能是减号,且分数表达式不含空格)

输出格式

分数表达式计算的结果

样例

输入数据 1

1/12+5/12

输出数据 1

1/2

提示

注意考虑特殊情况,如:1/2+1/2=1,1/2-1/2=0,这些情况下结果不需要表现为分数形式。

#include<bits/stdc++.h>
using namespace std;
string n , m = "" , k = "" , l , f; 
int mlenf;
int bh(string a)//把字符串转成数字
{
    int ans=0;
    for(int i=0;i<a.size();i++)
    {
        ans=ans*10+(a[i]-'0');
    }
    return ans;
}
int main(){
    getline(cin , n , '/');
    getline(cin , f , '/');
    int len = f.size();
    for(int i = 0;i < len;i++)
    {
        if(f[ i ] == '+' || f[ i ] == '-')break;

        m += f[i];

        mlenf = i;
    }
    for(int i = mlenf+2;i < len;i++)
    {
        k += f[i];
    }
    getline(cin,l,'\n');
    if(f[mlenf+1]=='-')
    {
        int z1=bh(n);
        int z2=bh(k);
        int m1=bh(m);
        int m2=bh(l);
        int y=z1*m2-z2*m1,t=m1*m2;//十字交叉
        if(y==0)cout<<"0";
        else
        {
            for(int i=10000;i!=0;i--)//约分
            {    
                if(y%i==0&&t%i==0){y/=i,t/=i;break;}
                if(t%y==0){t/=y,y=1;break;}
            }
            if(t==1)cout<<y;
            else if(t<0)cout<<'-'<<y<<"/"<<abs(t);
            else cout<<y<<"/"<<t;
        }
    }
    else
    {
        int z1=bh(n);
        int z2=bh(k);
        int m1=bh(m);
        int m2=bh(l);
        int y=z1*m2+z2*m1,t=m1*m2;
        if(y==0)cout<<"0";
        else
        {
            for(int i=10000;i!=0;i--)
            {    
                if(y%i==0&&t%i==0){y/=i,t/=i;break;}
                if(t%y==0){t/=y,y=1;break;}
            }
            if(t==1)cout<<y;
            else if(t<0)cout<<'-'<<y<<"/"<<abs(t);
            else cout<<y<<"/"<<t;
        }
    }
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值