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

来源:互联网 发布:html页面写java代码 编辑:程序博客网 时间:2024/06/04 22:45
本题要求编写程序,计算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/32/3 * (-2) = (-1 1/3)2/3 / (-2) = (-1/3)
输入样例2:
5/3 0/6
输出样例2:
1 2/3 + 0 = 1 2/31 2/3 - 0 = 1 2/31 2/3 * 0 = 01 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;}