1034 有理数四则运算 (20 分)
重点在对分数的处理
1#include <iostream> 2#include <cmath> 3 4using namespace std; 5 6//辗转相除法 求最大公约数 7int gcd(long long a, long long b){ 8 return b == 0 ? a : gcd(b, a % b); 9} 10 11void print(long long a, long long b){ 12 long long c = 0; //带分数前面的整数部分,默认是0 13 if(a > 0){ //正数 14 if(b == 1){ //形如3/1 15 printf("%lld", a); 16 } 17 else if(a > b){ //形如5/3 18 c = a / b; 19 a -= b * c; 20 printf("%lld %lld/%lld", c, a, b); 21 } 22 else{ //真分数 形如3/5 23 printf("%lld/%lld", a, b); 24 } 25 } 26 else if(a == 0){ //形如0/3 27 printf("%c", '0'); 28 } 29 else{ //负数 30 if(b == 1){ //形如-3/1 31 printf("(%lld)", a); 32 } 33 else if(-1 * a > b){ //形如-5/3 34 c = a / b; 35 a = (-1 * a) % b; 36 printf("(%lld %lld/%lld)", c, a, b); 37 } 38 else{ //真分数 39 printf("(%lld/%lld)", a, b); 40 } 41 } 42} 43 44void add(long long a1, long long b1, long long a2, long long b2){ 45 print(a1, b1); 46 printf(" + "); 47 print(a2, b2); 48 printf(" = "); 49 long long a3 = a1 * b2 + a2 * b1; 50 long long b3 = b1 * b2; 51 //化简到最简形式,非带分数形式 52 long long gcd3 = abs(gcd(a3, b3)); 53 a3 /= gcd3; 54 b3 /= gcd3; 55 print(a3, b3); 56 printf("\n"); 57} 58 59void subtract(long long a1, long long b1, long long a2, long long b2){ 60 print(a1, b1); 61 printf(" - "); 62 print(a2, b2); 63 printf(" = "); 64 long long a3 = a1 * b2 - a2 * b1; 65 long long b3 = b1 * b2; 66 //化简到最简形式,非带分数形式 67 long long gcd3 = abs(gcd(a3, b3)); 68 a3 /= gcd3; 69 b3 /= gcd3; 70 print(a3, b3); 71 printf("\n"); 72} 73 74void multiply(long long a1, long long b1, long long a2, long long b2){ 75 print(a1, b1); 76 printf(" * "); 77 print(a2, b2); 78 printf(" = "); 79 long long a3 = a1 * a2; 80 long long b3 = b1 * b2; 81 //化简到最简形式,非带分数形式 82 long long gcd3 = abs(gcd(a3, b3)); 83 a3 /= gcd3; 84 b3 /= gcd3; 85 print(a3, b3); 86 printf("\n"); 87} 88 89void divide(long long a1, long long b1, long long a2, long long b2){ 90 print(a1, b1); 91 printf(" / "); 92 print(a2, b2); 93 printf(" = "); 94 if(a2 == 0){ 95 printf("Inf"); 96 } 97 else if(a2 < 0){ 98 long long a3 = -1 * a1 * b2; 99 long long b3 = -1 * b1 * a2; 100 //化简到最简形式,非带分数形式 101 long long gcd3 = abs(gcd(a3, b3)); 102 a3 /= gcd3; 103 b3 /= gcd3; 104 print(a3, b3); 105 } 106 else{ 107 long long a3 = a1 * b2; 108 long long b3 = b1 * a2; 109 //化简到最简形式,非带分数形式 110 long long gcd3 = abs(gcd(a3, b3)); 111 a3 /= gcd3; 112 b3 /= gcd3; 113 print(a3, b3); 114 } 115 printf("\n"); 116} 117 118int main(){ 119 long long a1, b1, a2, b2; 120 long long c1 = 0, c2 = 0; 121 scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2); 122 //先化简到最简形式,非带分数形式 123 long long gcd1 = abs(gcd(a1, b1));//abs绝对值 124 a1 /= gcd1; 125 b1 /= gcd1; 126 long long gcd2 = abs(gcd(a2, b2)); 127 a2 /= gcd2; 128 b2 /= gcd2; 129 //统一用最简形式参与运算 130 add(a1, b1, a2, b2); 131 subtract(a1, b1, a2, b2); 132 multiply(a1, b1, a2, b2); 133 divide(a1, b1, a2, b2); 134 return 0; 135}