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

本题要求编写程序,计算2个有理数的和、差、积、商。

输入格式:

输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。

输出格式:

分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。

输入样例1:
2/3 -4/2
输出样例1:
2/3 + (-2) = (-1 1/3)
2/3 - (-2) = 2 2/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf


这题不能用int,可以用long  ,long long,long long int;


思路:这题的思路主要都在print1中

         化简输入的两个分数,输出第一个数,根据+-*/进入不同的选择,计算出来结果,然后输出第二个数,最后化简计算出来的结果,输出结果

#include<cstdio>
#include<iostream>
using namespace std;
long gcd(long a,long b)//找最大公约数
{
    if(a<0)a=-a;
    if(b==0)return a;
    else return gcd(b,a%b);
}
int huajian(long *a,long *b)
{
    long a1=*a,b1=*b;
    if(a1%b1==0){*a=a1/b1,*b=1;return -1;}//两个数可化为一个数
    long y=gcd(a1,b1);
    long x=a1/b1;//分数前面的系数
    *a/=y,*b/=y;
    if(x==0)return 0;//真分数
    else//假分数
    {
        if(x<0)x=-x,*a=-*a,*a-=(*b)*x,*a=-*a;
        else *a-=(*b)*x;
        return x;
    }
}
void print(long x,long a,long b)//打印一个数
{
    if(x==-1)//一个数
    {
        if(a<0)printf("(%ld)",a/b);
        else printf("%ld",a/b);
    }
    else if(x==0)//真分数
    {
        if(a<0)printf("(%ld/%ld)",a,b);
        else
            printf("%ld/%ld",a,b);
    }
    else//假分数
    {
        if(a<0)
        {
            x=-x;a=-a;
            printf("(%ld ",x);
            printf("%ld/%ld)",a,b);
        }
        else
        {
            printf("%ld %ld/%ld",x,a,b);
        }
    }
}
void print1(long *a,long *b,long *c,long *d,char op)
{
    long a1=*a,b1=*b,c1=*c,d1=*d,s1,s2,f=0,x1,x2,x3;
    x1=huajian(a,b);
    x2=huajian(c,d);
    print(x1,*a,*b);
    switch(op)
    {
        case '+':printf(" + ");
                 s1=a1*d1+b1*c1;
                 s2=b1*d1;
                 break;
        case '-':printf(" - ");
                 s1=a1*d1-b1*c1;
                 s2=b1*d1;
                 break;
        case '*':printf(" * ");
                 s1=a1*c1;
                 s2=b1*d1;
                 break;
        case '/':printf(" / ");
                 s1=a1*d1;
                 s2=b1*c1;
                 if(s2<0)s2=-s2,s1=-s1;//第二个数不能为负
                 else if(s2==0)f=1;//标记除数是否为0
                 break;
        default:break;
    }
    print(x2,*c,*d);
    printf(" = ");
    if(!f)//除数不为0
    {
        x3=huajian(&s1,&s2);
        print(x3,s1,s2);
        cout<<endl;
    }
    else
        cout<<"Inf";
}
int main()
{
   long a1,b1,a2,b2;
   scanf("%ld/%ld %ld/%ld",&a1,&b1,&a2,&b2);
   long a=a1,b=b1,c=a2,d=b2;
   print1(&a1,&b1,&a2,&b2,'+');
   a1=a,b1=b,a2=c,b2=d;
   print1(&a1,&b1,&a2,&b2,'-');
   a1=a,b1=b,a2=c,b2=d;
   print1(&a1,&b1,&a2,&b2,'*');
   a1=a,b1=b,a2=c,b2=d;
   print1(&a1,&b1,&a2,&b2,'/');
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值