有理数四则运算 PTA1034

题目: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 }
View Code
原文地址:https://www.cnblogs.com/hbhdhd/p/11420895.html