PAT-乙级-1034 有理数四则运算

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



分析:
  此题是目前最麻烦的一道题
  题目思路很清洗,但代码量很大
  PS:
    注意负数加括号
    注意a/b为最简分式,需要计算gcd
    注意分母为0时结果为Inf






  1 //c++
  2 
  3 #include <iostream>
  4 using namespace std;
  5 
  6 void func(long,long,long *);
  7 void print(long *,long *,long *,char);
  8 void pri(long *);
  9 long gcd(long,long);
 10 int main(){
 11   long x,y,z,o,p,q,f1=0,f2=0;
 12   long w[4],v[4],g[4];
 13   char s1[40],s2[40];
 14   cin>>s1>>s2;
 15   
 16   long i,a=0,b=0,c=0,d=0;
 17   if(s1[0]=='-')
 18       i=1,f1=1;
 19   else
 20       i=0;
 21   for(;s1[i]!='/';i++)
 22     a=a*10+s1[i]-'0';
 23   for(i++;s1[i]!='';i++)
 24     b=b*10+s1[i]-'0';
 25   f1?a=-a:a=a;
 26   if(s2[0]=='-')
 27       i=1,f2=1;
 28   else
 29       i=0;
 30   for(;s2[i]!='/';i++)
 31     c=c*10+s2[i]-'0';
 32   for(i++;s2[i]!='';i++)
 33     d=d*10+s2[i]-'0';
 34     f2?c=-c:c=c;
 35   p=a*d;//分子乘分母 
 36   q=b*c;//分母乘分子 
 37   x=p+q;//
 38   z=p-q;//
 39   y=b*d;//分母乘 
 40   o=a*c;//分子乘
 41   func(a,b,w);
 42   func(c,d,v);
 43   func(x,y,g);
 44   print(w,v,g,'+');
 45   func(z,y,g);
 46   print(w,v,g,'-');
 47   func(o,y,g);
 48   print(w,v,g,'*');
 49   func(p,q,g);
 50   print(w,v,g,'/');
 51   return 0; 
 52 }
 53 long gcd(long a,long b){
 54     if(a==0)
 55         return 1;
 56     long c;
 57     while(a){
 58         c=b%a;
 59         b=a;
 60         a=c;
 61     } 
 62     return b;
 63 } 
 64 void func(long a,long b,long *w){//分别返回[符号整数分子分母]
 65     if(b==0){
 66         w[1]=w[2]=0;
 67         return ;
 68     }
 69     if(a<0){
 70         a=-a;
 71         if(b<0)
 72             w[0]=0,b=-b;
 73         else
 74             w[0]=1;
 75     }
 76     else{
 77         if(b<0)
 78             w[0]=1,b=-b;
 79         else
 80             w[0]=0;
 81     }
 82     w[1]=a/b;
 83     w[2]=a%b;
 84     long t=gcd(w[2],b);
 85     w[2]/=t;
 86     w[3]=b/t;
 87 }
 88 void pri(long *x){
 89     if(x[0]==1){//负数加括号 
 90         if(x[2]==0)
 91             cout<<"(-"<<x[1]<<')';
 92         else
 93             if(x[1]==0) 
 94                 cout<<"(-"<<x[2]<<'/'<<x[3]<<')';
 95             else
 96                 cout<<"(-"<<x[1]<<' '<<x[2]<<'/'<<x[3]<<')';
 97     }
 98     else{
 99         if(x[2]==0)
100             cout<<x[1];
101         else
102             if(x[1]==0)
103                 cout<<x[2]<<'/'<<x[3];
104             else
105                 cout<<x[1]<<' '<<x[2]<<'/'<<x[3];        
106     }    
107 }
108 void print(long *x,long *y,long *z,char c){
109     pri(x);
110     cout<<' '<<c<<' ';
111     pri(y);
112     cout<<" = ";
113     if(c=='/'&&y[1]==0&&y[2]==0)
114         cout<<"Inf";
115     else
116         pri(z);
117     cout<<endl; 
118 }
 
原文地址:https://www.cnblogs.com/tenjl-exv/p/9862176.html