1034 有理数四则运算 (20分)

Posted geyang

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了1034 有理数四则运算 (20分)相关的知识,希望对你有一定的参考价值。

本题要求编写程序,计算 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

整整写了两天,重写了很多遍,需要注意的问题有几个,判断的时候别两个数别直接乘,会超出正数范围;一定要算最大公约数来简化分数,用暴力算法会超时会越界。顺利的时候一点可以写几道题,不顺利的时候几天写不了一道题,有些坑真的是又深又硬,考试的时候遇到这种还是直接放弃吧,不要在一半分上钻牛角尖。
  1 #include<iostream>
  2 #include<math.h> 
  3 #include <string>
  4 using namespace std;
  5 long long int gys(long  long a,long long  b){
  6     return b==0 ? a : gys(b,a%b);
  7 }
  8 void num1(long long  a, long long b){
  9 
 10     if(b<0){
 11         a=-a;
 12         b=-b;
 13     }
 14     long long c;
 15     if(a==0){
 16         cout<<0;
 17     }else if(abs(a)>abs(b)){
 18         if(a%b==0){
 19             c=a/b;
 20             cout<<c;
 21         }else{
 22             c=a/b;
 23             cout<<c<<" "<<fabs(a%b)<<"/"<<b;
 24         }
 25         
 26     }else if(a%b==0){
 27         cout<<a/b;
 28     }else
 29         cout<<a<<"/"<<b;
 30 }
 31 
 32 int main(){    
 33     long long  a,b,a1,a2,b1,b2,c;
 34     
 35     scanf("%lld/%lld %lld/%lld",&a1,&b1,&a2,&b2);
 36     c=gys(a1,b1);
 37     a1=a1/c;
 38     b1=b1/c;
 39     c=gys(a2,b2);
 40     a2=a2/c;
 41     b2=b2/c;
 42     //加法 
 43     //输出第一个有理数 
 44     if((a1<0&&b1>0)||(a1>0&&b1<0)){
 45         cout<<"(";num1(a1,b1);cout<<")";
 46     }else
 47     num1(a1,b1);
 48     cout<<" + ";    
 49     //输出第二个有理数 
 50     if((a2<0&&b2>0)||(a2>0&&b2<0)){
 51         cout<<"(";num1(a2,b2);cout<<")";
 52     }else
 53         num1(a2,b2);    
 54     //输出计算结果    
 55     a=a1*b2+a2*b1;
 56     b=b1*b2; 
 57     c=gys(a,b);
 58     a=a/c;
 59     b=b/c;
 60     if(b==0)
 61         cout<<" = Inf";
 62     else if(a==0)
 63         cout<<" = 0";
 64     else if((a<0&&b>0)||(a>0&&b<0)){
 65         cout<<" = (";num1(a,b);cout<<")";
 66     }else{
 67         cout<<" = ";
 68         num1(a,b);
 69     }
 70         
 71     cout<<"
";
 72     //减法     
 73     // 输入第一个有理数 
 74     if((a1<0&&b1>0)||(a1>0&&b1<0)){
 75         cout<<"(";num1(a1,b1);cout<<")";
 76     }else    
 77         num1(a1,b1);
 78     cout<<" - ";
 79     // 输入第二个有理数 
 80     if((a2<0&&b2>0)||(a2>0&&b2<0)){
 81         cout<<"(";num1(a2,b2);cout<<")";
 82     }else    
 83         num1(a2,b2);    
 84     a=a1*b2-a2*b1;
 85     b=b1*b2; 
 86     c=gys(a,b);
 87     a=a/c;
 88     b=b/c;
 89     if(b==0)
 90         cout<<" = Inf";
 91     else if(a==0)
 92         cout<<" = 0";
 93     else if((a<0&&b>0)||(a>0&&b<0)){
 94         cout<<" = (";num1(a,b);cout<<")";
 95     }else{
 96         cout<<" = ";
 97         num1(a,b);}
 98     cout<<"
";    
 99     //乘法 
100     if((a1<0&&b1>0)||(a1>0&&b1<0)){
101         cout<<"(";num1(a1,b1);cout<<")";
102     }else
103         num1(a1,b1);
104     cout<<" * ";    
105     if((a2<0&&b2>0)||(a2>0&&b2<0)){
106         cout<<"(";num1(a2,b2);cout<<")";
107     }else
108         num1(a2,b2);    
109     a=a1*a2;
110     b=b1*b2;
111     c=gys(a,b);
112     a=a/c;
113     b=b/c;
114     if(b==0)
115         cout<<" = Inf";
116     else if(a==0)
117         cout<<" = 0";
118     else if((a<0&&b>0)||(a>0&&b<0)){
119         cout<<" = (";num1(a,b);cout<<")";
120     }else{
121         cout<<" = ";
122         num1(a,b);    }
123     cout<<"
";
124     //除法 
125     if((a1<0&&b1>0)||(a1>0&&b1<0)){
126         cout<<"(";num1(a1,b1);cout<<")";
127     }else
128         num1(a1,b1);
129     cout<<" / ";
130     if((a2<0&&b2>0)||(a2>0&&b2<0)){
131         cout<<"(";num1(a2,b2);cout<<")";
132     }else    
133         num1(a2,b2);    
134     a=a1*b2;b=b1*a2;
135     c=gys(a,b);    a=a/c;b=b/c;
136     if(b==0)
137         cout<<" = Inf";
138     else if(a%b==0){
139         cout<< " = "<<a/b;
140     }
141     else if(a==0)
142         cout<<" = 0";
143     else if(a==b)
144         cout<<" = 1";
145     else if((a<0&&b>0)||(a>0&&b<0)){
146         cout<<" = (";num1(a,b);cout<<")";
147     }else{
148         cout<<" = ";
149         num1(a,b);
150     }            
151     return 0;
152 }

 

以上是关于1034 有理数四则运算 (20分)的主要内容,如果未能解决你的问题,请参考以下文章

PAT乙级1034 有理数四则运算 (20 分)

1034. 有理数四则运算(20)

1034. 有理数四则运算(20)

1034. 有理数四则运算(20)

PAT乙级1034. 有理数四则运算(20)

PAT乙级1034