[PAT-乙级]1034.有理数四则运算

来源:互联网 发布:cf检测数据异常 编辑:程序博客网 时间:2024/05/20 10:55

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/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
注意在计算过程中,计算gcd和lcm可能会超出int表示的数据范围,所以得用long类型

#include<stdio.h>#include<string.h>long gcd(long x, long y){    return x == 0 ? y : gcd(y%x, x);}long lcm(long x, long y){    return x/gcd(x,y)*y;}void print(long x, long y){    bool flag = false;    if(x < 0 )    {        x = -x;        flag = true;    }    if(x / y != 0 && x % y != 0)    {        if(flag)            printf("(-%d %d/%d)", x / y, x%y/gcd(x%y,y), y/gcd(x%y,y));        else            printf("%d %d/%d", x / y, x%y/gcd(x%y,y), y/gcd(x%y,y));    }    else if(x / y == 0 && x % y != 0)    {        if(flag)            printf("(-%d/%d)", x/gcd(x,y), y/gcd(x,y));        else            printf("%d/%d",  x/gcd(x,y), y/gcd(x,y));    }    else if(x / y != 0 && x % y == 0)    {        if(flag)            printf("(-%d)", x/y);        else            printf("%d",  x/y);    }    else        printf("0");}int main(){    freopen("D://input.txt", "r", stdin);    long a, b, c, d;    while(scanf("%ld/%ld %ld/%ld", &a, &b, &c, &d) != EOF)    {        // case +        long res1 = 0, res2 = 0;        print(a, b);        printf(" + ");        print(c, d);        printf(" = ");        res1 = a * lcm(b, d)/b + c * lcm(b, d)/d;        res2 = lcm(b, d);        print(res1, res2);        printf("\n");        // case -        print(a, b);        printf(" - ");        print(c, d);        printf(" = ");        res1 = a* lcm(b, d)/b - c* lcm(b, d)/d;        res2 = lcm(b, d);        print(res1, res2);        printf("\n");        //case *        print(a, b);        printf(" * ");        print(c, d);        printf(" = ");        res1 = a*c;        res2 = b*d;        print(res1, res2);        printf("\n");        // case /        print(a, b);        printf(" / ");        print(c, d);        printf(" = ");        if(c != 0)        {            if(c < 0)            {                d = -1*d;                c = -1*c;            }            res1 = a*d;            res2 = b*c;            print(res1, res2);        }        else            printf("Inf");        printf("\n");       }    return 0;}



原创粉丝点击