有理数四则运算(20)

题目描述
本题要求编写程序,计算2个有理数的和、差、积、商。


输入描述:
输入在一行中按照“a1/b1 a2/b2”的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为0。



输出描述:
分别在4行中按照“有理数1 运算符 有理数2 = 结果”的格式顺序输出2个有理数的和、差、积、商。注意输出的每个有理数必须是该有理数的最简形式“k a/b”,其中k是整数部分,a/b是最简分数部分;若为负数,则须加括号;若除法分母为0,则输出“Inf”。题目保证正确的输出中没有超过整型范围的整数。


输入例子:
5/3 0/6


输出例子:
1 2/3 + 0 = 1 2/3


1 2/3 - 0 = 1 2/3


1 2/3 * 0 = 0


1 2/3 / 0 = Inf

算法代码:

<span style="font-size:14px;">#include<iostream>
#include<math.h>
using namespace std;

//结果输出,k为整数部分,a、b是分子分母  
void output(int k,int a,int b){
  if(k<0){
    if(a==0)
      cout<<'('<<k<<')';
    else
      cout<<'('<<k<<" "<<a<<'/'<<b<<')';
  }
  else if(k==0){
    if(a<0)   
      cout<<'('<<a<<'/'<<b<<')';
    else if(a>0)
      cout<<a<<'/'<<b;
    else
      cout<<a;          
  }
  else{
    if(a!=0) 
      cout<<k<<" "<<a<<'/'<<b;
    else
      cout<<k; 
  }      
}

//化简函数,用于计算相应的k,a,b 
void simplify(int *a,int *b,int *k){ 
	//不断除以他们的公因数 
  for(int i=2;i<=abs(*a)&&i<=abs(*b);i++){
    while(*a%i==0&&*b%i==0){
      *a/=i;
      *b/=i;     
    }    
  }
  *k=*a/(*b);
  if(*k!=0)
    *a=abs(*a)-(*b)*abs(*k);
}
  
int main(){
  int a1,b1,a2,b2;
  int a3,b3,a4,b4,a5,b5,a6,b6;
  int k1,k2,k3,k4,k5,k6;
  char ch;   
  cin>>a1>>ch>>b1>>a2>>ch>>b2; 
  //加法处理 
  a3=a1*b2+a2*b1;
  b3=b1*b2;
  simplify(&a3,&b3,&k3);
  //减法处理 
  a4=a1*b2-a2*b1;
  b4=b1*b2;
  simplify(&a4,&b4,&k4);
	//乘法处理  
  a5=a1*a2;
  b5=b1*b2;
  simplify(&a5,&b5,&k5);
	//除法处理(即乘以除数的倒数)  
  a6=a1*b2;
  b6=b1*a2;
  //除数小于 0,将除数的负号放在被除数上,方便处理 
  if(b6<0){
      b6=-b6;
      a6=-a6;    
  }
  if(b6!=0)
    simplify(&a6,&b6,&k6);
	//输出加法 
  simplify(&a1,&b1,&k1);
  simplify(&a2,&b2,&k2); 
  output(k1,a1,b1);
  cout<<" + ";  
  output(k2,a2,b2);
  cout<<" = ";  
  output(k3,a3,b3);
  cout<<endl;
	//输出减法  
  output(k1,a1,b1);
  cout<<" - ";  
  output(k2,a2,b2);
  cout<<" = ";  
  output(k4,a4,b4);
  cout<<endl;
	//输出乘法 
  output(k1,a1,b1);
  cout<<" * ";  
  output(k2,a2,b2);
  cout<<" = ";  
  output(k5,a5,b5);
  cout<<endl;
	//输出除法   
  output(k1,a1,b1);
  cout<<" / ";  
  output(k2,a2,b2);
  cout<<" = ";  
  if(b6!=0)
    output(k6,a6,b6);
  else
    cout<<"Inf";
  cout<<endl;     
  return 0;
}</span>


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值