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

本文介绍了一个程序设计任务,即实现两个有理数的加、减、乘、除运算,并将结果以最简形式输出。文章提供了完整的C语言代码实现,包括自定义的数据结构、算法函数以及主函数流程。

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

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

时间限制
200 ms
内存限制
65536 kB
代码长度限制
8000 B
判题程序
Standard
作者
CHEN, Yue

本题要求编写程序,计算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<string.h>
struct E{   //分数结构体
    long long a;  //分子
    long long b;  //分母
};

long long gcd(long long a,long long b){
    return b==0?a:gcd(b,a%b);
}

void Output(E S){  //输出达方式
    long long a=S.a,b=S.b;
    bool flag=0;
    if(b==0) printf("Inf");   //分母为零
    else if(a==0) printf("0");    //分子为零
    else{
        if(a<0){    //负数,先输出负号,再变为正数
            printf("(-");
            a = -a;
            flag = 1;
        }
        if(a%b==0) printf("%lld",a/b);   //整数
        else{   //分数
            if(a>b){    //假分数
                printf("%lld ",a/b);
                a %= b;
            }
            long long tmp=gcd(a,b);
            a /= tmp;
            b /= tmp;
            printf("%lld/%lld",a,b);
        }
        if(flag) printf(")");
    }
}

void Cal(E A,E B, char op){
    E ans;
    switch(op){
        case '+':
            ans.a=A.a*B.b+A.b*B.a;
            ans.b=A.b*B.b;
            break;
        case '-':
            ans.a=A.a*B.b-A.b*B.a;
            ans.b=A.b*B.b;
            break;
        case '*':
            ans.a=A.a*B.a;
            ans.b=A.b*B.b;
            break;
        case '/':
            ans.a=A.a*B.b;
            ans.b=A.b*B.a;
            if(ans.b<0){    //调整分母为正
                ans.a = -ans.a;
                ans.b = -ans.b;
            }
            break;
    }
    Output(A);  //输出第一个运算数
    printf(" %c ",op);  //输出运算符
    Output(B);  //输出第二个运算数
    printf(" = ");  //输出等号
    Output(ans);    //输出结果
    printf("\n");
}

int main(){
    E A,B;
    scanf("%lld/%lld %lld/%lld",&A.a,&A.b,&B.a,&B.b);
    Cal(A,B,'+');
    Cal(A,B,'-');
    Cal(A,B,'*');
    Cal(A,B,'/');
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值