For two rational numbers, your task is to implement the basic arithmetics, that is, to calculate their sum, difference, product and quotient.
Input Specification:
Each input file contains one test case, which gives in one line the two rational numbers in the format “a1/b1 a2/b2”. The numerators and the denominators are all in the range of long int. If there is a negative sign, it must appear only in front of the numerator. The denominators are guaranteed to be non-zero numbers.
Output Specification:
For each test case, print in 4 lines the sum, difference, product and quotient of the two rational numbers, respectively. The format of each line is “number1 operator number2 = result”. Notice that all the rational numbers must be in their simplest form “k a/b”, where k is the integer part, and a/b is the simplest fraction part. If the number is negative, it must be included in a pair of parentheses. If the denominator in the division is zero, output “Inf” as the result. It is guaranteed that all the output integers are in the range of long int.
Sample Input 1:
1 |
2/3 -4/2 |
Sample Output 1:
1 2 3 4 |
2/3 + (-2) = (-1 1/3) 2/3 - (-2) = 2 2/3 2/3 * (-2) = (-1 1/3) 2/3 / (-2) = (-1/3) |
Sample Input 2:
1 |
5/3 0/6 |
Sample Output 2:
1 2 3 4 |
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 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 |
#include<stdio.h> #include<math.h> #define ABS(x) ((x)>0?(x):(-x)) typedef struct fraction { long numerator; long denominator; long num; } FRACTION; FRACTION simplify(FRACTION a) { long i,flag=1; if(a.denominator==0) { a.num=0; return a; } if(a.numerator>0&&a.denominator<0||a.numerator<0&&a.denominator>0) { flag=-1; a.numerator=ABS(a.numerator); a.denominator=ABS(a.denominator); } else if(a.numerator<0&&a.denominator<0) { flag=1; a.numerator=ABS(a.numerator); a.denominator=ABS(a.denominator); } a.num=a.numerator/a.denominator; a.numerator%=a.denominator; if(a.numerator!=0&&a.denominator%a.numerator==0) { a.denominator=a.denominator/a.numerator; a.numerator=1; } if(a.numerator>1) { for(i=sqrt(a.numerator);i>1;i--) { while(a.numerator%i==0&&a.denominator%i==0) { a.numerator/=i; a.denominator/=i; } } } if(a.num!=0) a.num=flag*a.num; else a.numerator=flag*a.numerator; return a; } FRACTION plus(FRACTION a,FRACTION b) { FRACTION c; c.denominator=a.denominator*b.denominator; c.numerator=a.numerator*b.denominator+b.numerator*a.denominator; return c; } FRACTION sub(FRACTION a,FRACTION b) { FRACTION c; c.denominator=a.denominator*b.denominator; c.numerator=a.numerator*b.denominator-b.numerator*a.denominator; return c; } FRACTION multi(FRACTION a,FRACTION b) { FRACTION c; c.denominator=a.denominator*b.denominator; c.numerator=a.numerator*b.numerator; return c; } FRACTION div(FRACTION a,FRACTION b) { FRACTION c; c.denominator=a.denominator*b.numerator; c.numerator=a.numerator*b.denominator; return c; } void print(FRACTION a) { if(a.num==0) { if(a.denominator==0) printf("Inf"); else if(a.numerator==0) printf("0"); else { if(a.numerator<0) printf("(-%ld/%ld)",ABS(a.numerator),ABS(a.denominator)); else printf("%ld/%ld",a.numerator,a.denominator); } } else if(a.numerator==0) { if(a.num>0) printf("%ld",a.num); else printf("(%ld)",a.num); } else { if(a.num>0) printf("%ld %ld/%ld",a.num,a.numerator,a.denominator); else printf("(%ld %ld/%ld)",a.num,a.numerator,a.denominator); } } void print_expression(FRACTION a,FRACTION b,FRACTION c,char o) { print(a); printf(" %c ",o); print(b); printf(" = "); print(c); printf("\n"); } int main() { FRACTION a,b,a_s,b_s,c; scanf("%ld/%ld %ld/%ld",&a.numerator,&a.denominator,&b.numerator,&b.denominator); a_s=simplify(a); b_s=simplify(b); c=simplify(plus(a,b)); print_expression(a_s,b_s,c,'+'); c=simplify(sub(a,b)); print_expression(a_s,b_s,c,'-'); c=simplify(multi(a,b)); print_expression(a_s,b_s,c,'*'); c=simplify(div(a,b)); print_expression(a_s,b_s,c,'/'); } |