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

Posted 一只菜鸡

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1034. 有理数四则运算(20)相关的知识,希望对你有一定的参考价值。

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

 注意:

  1.最后一个测试点一直未通过不清楚为什么

  2.int*int会溢出int表示范围

  3.注意绝对值abs的应用 避免-1/-2的情况出现

 

#include <iostream>
#include <iomanip>
#include <math.h>
#include <stdio.h>
#include <string>
#include <algorithm>
#include <vector>
#include <map>
using namespace std;

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

struct fenshu
{
    long long fenzi;
    long long fenmu;
}fs[2];

void printfs(fenshu a)
{
    long long com = gcd(abs(a.fenmu), abs(a.fenzi));
    double value = (double)a.fenzi / (double)a.fenmu;
    long long zheng = abs((long long)value);
    if (com != 1)
    {
        a.fenmu = a.fenmu / com;
        a.fenzi = a.fenzi / com;
    }
     if (value == 0)
    {
        cout <<0;
    }

     else if (abs(int(value)-value) < 1e-10)
    {
        if (value > 0)
            cout << value;
        else
            cout << "(" << value << ")";
    }
    else if (value < 0)
    {
        if (abs(value)>1)
        {
            cout << "(-" <<zheng<<" "<<abs(abs(a.fenzi) - zheng*abs(a.fenmu)) << "/" << abs(a.fenmu) << ")" ;
        }
        else  
        {
            cout << "(-" << abs(a.fenzi) << "/" << abs(a.fenmu) << ")" ;
        }
    }
    else
    {
        if (value > 1)
        {
            cout << zheng << " " << abs(abs(a.fenzi) - zheng*abs(a.fenmu)) << "/" << abs(a.fenmu) ;
        }
        else
        {
            cout << abs(a.fenzi) << "/" << abs(a.fenmu) ;
        }
    }
}
int main()

{
    scanf("%lld/%lld", &fs[0].fenzi, &fs[0].fenmu);
    scanf("%lld/%lld", &fs[1].fenzi, &fs[1].fenmu);
    fenshu jia, jian,cheng, chu;
    jia.fenzi = (fs[0].fenzi*fs[1].fenmu + fs[1].fenzi*fs[0].fenmu);
    jia.fenmu = fs[0].fenmu*fs[1].fenmu;
    jian.fenzi = (fs[0].fenzi*fs[1].fenmu - fs[1].fenzi*fs[0].fenmu);
    jian.fenmu = fs[0].fenmu*fs[1].fenmu;
    cheng.fenzi = fs[0].fenzi*fs[1].fenzi;
    cheng.fenmu = fs[0].fenmu*fs[1].fenmu;
    chu.fenzi = fs[0].fenzi*fs[1].fenmu;
    chu.fenmu = fs[0].fenmu*fs[1].fenzi;
    printfs(fs[0]); cout << " + "; printfs(fs[1]); cout << " = "; printfs(jia);cout<<endl;
    printfs(fs[0]); cout << " - "; printfs(fs[1]); cout << " = "; printfs(jian); cout << endl;
    printfs(fs[0]); cout << " * "; printfs(fs[1]); cout << " = "; printfs(cheng); cout << endl;
    if (fs[1].fenzi == 0 || fs[1].fenmu == 0)
    {
        printfs(fs[0]); cout << " / "; printfs(fs[1]); cout << " = "; cout << "Inf"; cout << endl;
    }
    else
    {
        printfs(fs[0]); cout << " / "; printfs(fs[1]); cout << " = "; printfs(chu); cout << endl;
    }
    system("pause");
    return 0;
}

 

以上是关于1034. 有理数四则运算(20)的主要内容,如果未能解决你的问题,请参考以下文章

PAT1034 有理数四则运算 (20分)

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

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

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

PAT乙级1034 有理数四则运算 (20 分)

PAT乙级1034