1034. 有理数四则运算

来源:互联网 发布:微博淘宝优惠券安全吗 编辑:程序博客网 时间:2024/05/16 00:58

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

  1. 算法开始。
  2. 分别读取四个数字。
  3. 进行加减乘除运算,得到结果。
  4. 将假分数化简为最简带分数,将真分数化为最简真分数。
  5. 输出加减乘除四个运算。除法,若除数为零,则结果为Inf。
  6. 算法结束。

注意:由于题目未限制整数大小,所以应该把分子、分母变量设为long long,即占8个字节。否则PAT上有的测试用例会出错。


#include <stdio.h>#include <stdlib.h>#include <math.h>#define MAX 1000typedef struct fraction{    long long n;    long long a;    long long b;} fraction;fraction convert(fraction);void print(fraction v3, char operator, fraction v4, fraction result);void print_fraction(fraction v);long long greatest_common_divisor(long long a, long long b);int main(int argc, const char * argv[]) {    fraction v1={0}, v2={0}, result={0}, v3={0}, v4={0};    scanf("%lld/%lld %lld/%lld", &(v1.a), &(v1.b), &(v2.a), &(v2.b));    result.a=v1.a*v2.b+v2.a*v1.b;    result.b=v1.b*v2.b;    result=convert(result);    v3=convert(v1);    v4=convert(v2);    print(v3, '+', v4, result);    putchar('\n');    result.a=v1.a*v2.b-v2.a*v1.b;    result.b=v1.b*v2.b;    result=convert(result);    print(v3, '-', v4, result);    putchar('\n');    result.a=v1.a*v2.a;    result.b=v1.b*v2.b;    result=convert(result);    print(v3, '*', v4, result);    putchar('\n');    result.a=v1.a*v2.b;    result.b=v1.b*v2.a;    result=convert(result);    print(v3, '/', v4, result);    return 0;}fraction convert(fraction f){    long long div=0;    fraction tmp={0};    if(f.a<0){        tmp.a=-f.a;    }    else{        tmp.a=f.a;    }    if(f.b<0){        tmp.b=-f.b;    }    else{        tmp.b=f.b;    }    if(tmp.a*tmp.b){        div=greatest_common_divisor(tmp.a,tmp.b);        tmp.a/=div;        tmp.b/=div;    }    if(tmp.b){        tmp.n=tmp.a/tmp.b;        tmp.a=tmp.a%tmp.b;        if((f.a>=0)^(f.b>=0)){            if(tmp.n){                tmp.n*=-1;            }            else{                tmp.a*=-1;            }        }    }    else{        tmp.n=0;        tmp.a=0;        tmp.b=0;    }    return tmp;}long long greatest_common_divisor(long long a, long long b){    long long i;    while(a%b!=0){        i=a%b;        a=b;        b=i;    }    return b;}void print(fraction v3, char c, fraction v4, fraction result){    print_fraction(v3);    printf(" %c ", c);    print_fraction(v4);    printf(" = ");    print_fraction(result);    return ;}void print_fraction(fraction v){    if(v.n<0){        if(v.a==0){            printf("(%lld)", v.n);        }        else{            printf("(%lld %lld/%lld)", v.n, v.a, v.b);        }    }    else if(v.n==0){        if(v.a==0){            if(v.b){                printf("%lld", v.n);            }            else{                printf("Inf");            }        }        else if(v.a>0){            printf("%lld/%lld", v.a, v.b);        }        else if(v.a<0){            printf("(%lld/%lld)", v.a, v.b);        }    }    else if(v.n>0){        if(v.a==0){            printf("%lld", v.n);        }        else if(v.a>0){            printf("%lld %lld/%lld", v.n, v.a, v.b);        }    }    return ;}



0 0