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

题目描述

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

输入描述:

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

输出描述:

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

输入例子:

5/3 0/6

输出例子:

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 <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int maxn = 100;
char res1[maxn], res2[maxn], ans1[maxn], ans2[maxn], ans3[maxn], ans4[maxn];//存储输出的各个简化之后的分数
long long A1, B1, A2, B2;//存储输入分子、分母、分子、分母(包括符号)
void sum(long long a1, long long b1, long long a2, long long b2, char temp[])//参数分别是运算数1的分子、分母,运算数2的分子、分母,temp存储了未约分的结果(最后在main函数中会统一对其简化)
{
    sprintf(temp, "%lld/%lld", a1 * b2 + a2 * b1, b1 * b2);
}
void mul(long long a1, long long b1, long long a2, long long b2, char temp[])
{
    sprintf(temp, "%lld/%lld", a1 * a2, b1 * b2);
}
long long gcd(long long a, long long b)
{
    return !b ? a : gcd(b, a % b);
}
void sim(char s[], char res[]);
 
int main()
{
    char temp[maxn];
    char s1[maxn], s2[maxn];
 
    scanf("%s%s", s1, s2);
    sscanf(s1, "%lld/%lld", &A1, &B1);
    sscanf(s2, "%lld/%lld", &A2, &B2);//获取 A1, B1, A2, B2;
    sim(s1, res1), sim(s2, res2);//化简输入的因子;
    sum(A1, B1, A2, B2, temp), sim(temp, ans1);
    sum(A1, B1, -A2, B2, temp), sim(temp, ans2);
    mul(A1, B1, A2, B2, temp), sim(temp, ans3);
    if(A2 != 0) mul(A1, B1, A2 / abs(A2) * B2, abs(A2), temp), sim(temp, ans4);
    printf("%s + %s = %s\n", res1, res2, ans1);
    printf("%s - %s = %s\n", res1, res2, ans2);
    printf("%s * %s = %s\n", res1, res2, ans3);
    printf("%s / %s = %s\n", res1, res2, !A2 ? "Inf" : ans4);
 
    return 0;
}
void sim(char s[], char res[])
{
    char temp[maxn];
    long long a, b, mgcd;
 
    sscanf(s, "%lld/%lld", &a, &b);
    mgcd = gcd(abs(a), b);//求得最大公约数(正数)
    a /= mgcd, b /= mgcd;//约分
    if(a / b)//判断是否有整数位
    {
        sprintf(temp, "%lld", a / b);
        if(a % b)//判断是否有分数
            sprintf(&temp[strlen(temp)], " %lld/%lld", abs(a % b), b);
    }
    else
    {
        if(a % b)//判断是否有分数
            sprintf(temp, "%lld/%lld", a, b);
        else sprintf(temp, "%lld", 0);//只有0的情况
    }
    if(temp[0] == '-')//最后处理一哈加括号()的问题
        sprintf(res, "(%s)", temp);
    else sprintf(res, "%s", temp);
}
发布了276 篇原创文章 · 获赞 30 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/weixin_42905141/article/details/103911201
今日推荐