题目:https://pintia.cn/problem-sets/994805260223102976/problems/994805287624491008
本题要求编写程序,计算 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/3
2/3 * (-2) = (-1 1/3)
2/3 / (-2) = (-1/3)
输入样例 2:
5/3 0/6
输出样例 2:
1 2/3 + 0 = 1 2/3
1 2/3 - 0 = 1 2/3
1 2/3 * 0 = 0
1 2/3 / 0 = Inf
题解:我碰到的都是一些什么神仙题啊,本题的关键就是对分子分母的处理,计算没什么难度,我用%64d输出输出一直错误,调了一下午,怪我喽!
还有pta里面好像不能用abs()函数,会有浮点错误。
代码:
1 #include <map> 2 #include <stack> 3 #include <queue> 4 #include <cmath> 5 #include <string> 6 #include <limits> 7 #include <cstdio> 8 #include <vector> 9 #include <cstdlib> 10 #include <cstring> 11 #include <iostream> 12 #include <algorithm> 13 #define Scc(c) scanf("%c",&c) 14 #define Scs(s) scanf("%s",s) 15 #define Sci(x) scanf("%d",&x) 16 #define Sci2(x, y) scanf("%d%d",&x,&y) 17 #define Sci3(x, y, z) scanf("%d%d%d",&x,&y,&z) 18 #define Scl(x) scanf("%I64d",&x) 19 #define Scl2(x, y) scanf("%I64d%I64d",&x,&y) 20 #define Scl3(x, y, z) scanf("%I64d%I64d%I64d",&x,&y,&z) 21 #define Pri(x) printf("%d ",x) 22 #define Prl(x) printf("%I64d ",x) 23 #define Prc(c) printf("%c ",c) 24 #define Prs(s) printf("%s ",s) 25 #define For(i,x,y) for(int i=x;i<y;i++) 26 #define For_(i,x,y) for(int i=x;i<=y;i++) 27 #define FFor(i,x,y) for(int i=x;i>y;i--) 28 #define FFor_(i,x,y) for(int i=x;i>=y;i--) 29 #define Mem(f, x) memset(f,x,sizeof(f)) 30 #define LL long long 31 #define ULL unsigned long long 32 #define MAXSIZE 100005 33 #define INF 0x3f3f3f3f 34 35 const int mod=1e9+7; 36 const double PI = acos(-1.0); 37 38 using namespace std; 39 LL GCD(LL a,LL b) 40 { 41 return b==0?a:GCD(b,a%b) ; 42 } 43 LL abss(LL a) 44 { 45 if(a<0) 46 return a*(-1); 47 return a; 48 } 49 void check(LL a,LL b) 50 { 51 52 if(b==0) 53 { 54 printf("Inf"); 55 return ; 56 } 57 else if(a==0) 58 { 59 printf("0"); 60 return ; 61 } 62 LL t=GCD(abss(a),abss(b)); 63 a=a/t; 64 b=b/t; 65 LL tmp=a/b; 66 if(a*b<0)//判断a 、b是异号还是同号 67 { 68 printf("("); 69 if(tmp!=0) 70 { 71 printf("%lld",tmp); 72 if(abss(a)!=abss(tmp*b)) 73 printf(" %lld/%lld",abss(a)-abss(tmp*b),abss(b)); 74 } 75 else 76 { 77 printf("-%lld/%lld",abss(a),abss(b)); 78 } 79 printf(")"); 80 } 81 else if(a*b>0) 82 { 83 if(tmp!=0) 84 { 85 printf("%lld",tmp); 86 if(abss(a)-abss(tmp*b)!=0) 87 printf(" %lld/%lld",abss(a)-abss(tmp*b),abss(b)); 88 } 89 else 90 printf("%lld/%lld",abss(a),abss(b)); 91 } 92 } 93 int main() 94 { 95 LL a,b,c,d; 96 scanf("%lld/%lld",&a,&b); 97 scanf("%lld/%lld",&c,&d); 98 LL x,y; 99 x=a*d+b*c,y=b*d; 100 check(a,b); 101 printf(" + "); 102 check(c,d); 103 printf(" = "); 104 check(x,y); 105 Prs(""); 106 x=a*d-b*c,y=b*d; 107 check(a,b); 108 printf(" - "); 109 check(c,d); 110 printf(" = "); 111 check(x,y); 112 Prs(""); 113 x=a*c; 114 y=b*d; 115 check(a,b); 116 printf(" * "); 117 check(c,d); 118 printf(" = "); 119 check(x,y); 120 Prs(""); 121 x=a*d; 122 y=c*b; 123 check(a,b); 124 printf(" / "); 125 check(c,d); 126 printf(" = "); 127 check(x,y); 128 Prs(""); 129 return 0; 130 }