本题要求编写程序,计算2个有理数的和、差、积、商。
输入格式:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。
输出格式:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。
输入样例1:
1 |
2/3 -4/2 |
输出样例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) |
输入样例2:
1 |
5/3 0/6 |
输出样例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 |
分子分母用int类型,测试点2、3会错误?换用long类型可过,运算过程中可能超出了整数的范围……
代码如下:
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,'/'); } |