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

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

代码:

#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std ; 	
typedef long long LL ; 
LL gcd(LL t1,LL t2){  //求最大公约数
  return t2==0? t1:gcd(t2,t1%t2);
}
int fun(LL a,LL b){   //判断分母是否为0
  long long int t=0,x=0;
  if(b==0){
    cout<<"Inf";
    return 0;
  }
  LL k=gcd(abs(a),b); // 负数只可能出现在 分母  
  a=a/k;  //化简分数
  b=b/k;
  t=abs(a)/b;  //整数部分
  x=abs(a)-t*b;  //分子部分
 

  if(a<0) {
    if((t!=0)&&(x!=0))
     printf("(-%lld %lld/%lld)",t,x,b);
    if((t!=0)&&(x==0))
     printf("(-%lld)",t);
    if((t==0)&&(x!=0))
     printf("(-%lld/%lld)",x,b);
    if((t==0)&&(x==0))
      printf("0");
  }
  if(a>=0){
    if(t!=0&&x!=0)
      printf("%d %d/%d",t,x,b);
    else if(t!=0&&x==0)
      printf("%d",t);
    else if(t==0&&x!=0)
      printf("%d/%d",x,b );
    else 
      printf("0");
  }
  return 0;
}
int main(){
  LL a1,b1,a2,b2;
  scanf("%lld/%lld",&a1,&b1);
  scanf("%lld/%lld",&a2,&b2);
  fun(a1,b1);
  cout<<' '<<'+'<<' ';
  fun(a2,b2);
  cout<<' '<<'='<<' ';
  fun(a1*b2+a2*b1,b1*b2);
  cout<<endl;
  fun(a1,b1);cout<<' '<<'-'<<' ';
  fun(a2,b2);
  cout<<' '<<'='<<' ';
  fun(a1*b2-a2*b1,b1*b2);
  cout<<endl;
  fun(a1,b1);cout<<' '<<'*'<<' ';fun(a2,b2);
  cout<<' '<<'='<<' ';fun(a1*a2,b1*b2);cout<<endl;
  fun(a1,b1);cout<<' '<<'/'<<' ';fun(a2,b2);
  cout<<' '<<'='<<' ';
  if(a2<0)
    fun(a1*b2*a2/abs(a2),b1*abs(a2));
  else
    fun(a1*b2,b1*a2);
  cout<<endl;
}

评论

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×