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

本文介绍了一个计算两个有理数的和、差、积、商的程序实现方法。输入为两个分数形式的有理数,输出为四行,分别对应它们的加、减、乘、除结果,并确保结果为最简形式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 本题要求编写程序,计算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

代码:

#include<stdio.h>
#include<stdlib.h>
long long a,b,c,a1,b1,c1,a2,c2,b2;
long long gcd(long long a,long long b)
{
    if(b==0)
        return a;
    else
        return gcd(b,a%b);
}
void output(char s)
{
    if(c<0||a<0)
    {
        printf("(");
    }
    if(c==0&&a!=0)
    {
        printf("%lld/%lld",a,b);
    }
    else if(c!=0&&a==0)
    {
        printf("%lld",c);
    }
    else if(c!=0&&a!=0)
    {
        printf("%lld %lld/%lld",c,a,b);
    }
    else
    {
        printf("0");
    }
    if(c<0||a<0)
    {
        printf(")");
    }
    printf(" %c ",s);
    if(c1<0||a1<0)
    {
        printf("(");
    }
    if(c1==0&&a1!=0)
    {
        printf("%lld/%lld",a1,b1);
    }
    else if(c1!=0&&a1==0)
    {
        printf("%lld",c1);
    }
    else if(c1!=0&&a1!=0)
    {
        printf("%lld %lld/%lld",c1,a1,b1);
    }
    else
    {
        printf("0");
    }
    if(c1<0||a1<0)
    {
        printf(")");
    }
    printf(" = ");
    if(s=='/'&&c1==0&&a1==0)
    {
        if(a==0&&c==0)
            printf("0");
        else
        printf("Inf");
        return ;
    }
    if(c2<0||a2<0)
    {
        printf("(");
    }
    if(c2==0&&a2!=0)
    {
        printf("%lld/%lld",a2,b2);
    }
    else if(c2!=0&&a2==0)
    {
        printf("%lld",c2);
    }
    else if(c2!=0&&a2!=0)
    {
        printf("%lld %lld/%lld",c2,a2,b2);
    }
    else
    {
        printf("0");
    }
    if(c2<0||a2<0)
    {
        printf(")");
    }
    printf("\n");
}
void change()
{
    c=a/b;
    if(c==0)
    a=a%b;
    else
    a=llabs(a)%b;
    long long tmp=gcd(llabs(a),b);
    a=a/tmp;
    b=b/tmp;
    c1=a1/b1;
    if(c1==0)
    a1=a1%b1;
    else
    a1=llabs(a1)%b1;
    tmp=gcd(llabs(a1),b1);
    a1=a1/tmp;
    b1=b1/tmp;
    //printf("%lld %lld\n",a1,b1);
}
void add()
{
    if(c<0)
        a2=(c*b-a)*b1;
    else
        a2=(c*b+a)*b1;
    if(c1<0)
        a2+=(c1*b1-a1)*b;
    else
        a2+=(c1*b1+a1)*b;
    b2=b*b1;
    long long tmp=gcd(llabs(a2),b2);
    a2=a2/tmp;
    b2=b2/tmp;
    c2=a2/b2;
    if(c2==0)
    a2=a2%b2;
    else
    a2=llabs(a2)%b2;
    output('+');
}
void minus()
{
    if(c<0)
        a2=(c*b-a)*b1;
    else
        a2=(c*b+a)*b1;
    if(c1<0)
        a2-=(c1*b1-a1)*b;
    else
        a2-=(c1*b1+a1)*b;
    b2=b*b1;
    long long tmp=gcd(llabs(a2),b2);
    a2=a2/tmp;
    b2=b2/tmp;
    c2=a2/b2;
    if(c2==0)
        a2=a2%b2;
    else
        a2=llabs(a2)%b2;
    output('-');
}
void multiply()
{
    if(c<0)
        a2=(c*b-a);
    else
        a2=(c*b+a);
    if(c1<0)
        a2*=(c1*b1-a1);
    else
        a2*=(c1*b1+a1);
    b2=b*b1;
    long long tmp=gcd(llabs(a2),b2);
    a2=a2/tmp;
    b2=b2/tmp;
    c2=a2/b2;
    if(c2==0)
    a2=a2%b2;
    else
    a2=llabs(a2)%b2;
    output('*');
}
void divide()
{
    if(c1==0&&a1==0)
        output('/');
    else
    {
        if(c<0)
            a2=(c*b-a);
        else
            a2=(c*b+a);
        a2*=b1;
        if(c1<0)
            b2=(c1*b1-a1);
        else
            b2=(c1*b1+a1);
        b2*=b;
        if(b2<0)
        {
            a2=-a2;
            b2=-b2;
        }
        long long tmp=gcd(llabs(a2),b2);
        a2=a2/tmp;
        b2=b2/tmp;
        c2=a2/b2;
        if(c2==0)
            a2=a2%b2;
        else
            a2=llabs(a2)%b2;
        output('/');
    }
}
int main()
{
    long long i,j,n,m,k,t;
    scanf("%lld/%lld %lld/%lld",&a,&b,&a1,&b1);
    change();
    add();
    minus();
    multiply();
    divide();
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值