#include<iostream>
#include<cstdio>
#include<algorithm>
#include<queue>
#include<string.h>
#include<cmath>
#include<string>
using namespace std;
//
/*************************
题意:
分数运算
输出表达式时要为整数+分数形式
*************************/
/************************
求解要点:
a1/a2 op b1/b2 =c1/c2
首先要约分化简。
约分通过计算最大公约数
即 if(b%a==0)
return a;
else
return getgys(a,b-a) 来计算,同时b必须比a大
然后同除
计算时不拆出整数,直接用分子分母来运算
同时注意处理符号和0的问题。
************************/
/***********************
笔记:
*********************/
#define M 100005
#define INF 0xfffff
long long getgys(long long a,long long b)
{
long long t;
if(a==0||b==0)
return 1;
if(a<0)
a=a*(-1);
if(b<0)
b=b*(-1);
if(a>b)
{
t=a;
a=b;
b=t;
}
if(b%a==0)
return a;
else
return getgys(a,b-a);
}
void putnum(long long a1, long long a2)
{
long long a3,a4,a5;
int f=0;
if(a1==0)
{
printf("0");
return ;
}
if(a2==0)
{
printf("Inf");
return ;
}
if(a1<0)
{
printf("(");
a1=(-1)*a1;
printf("-");
f=1;
}
a3=a1/a2;
a4=a1%a2;
if(a3!=0)
printf("%lld",a3);
if(a4!=0)
{
if(a3!=0)
cout<<" ";
printf("%lld/%lld",a4,a2);
}
if(f)
printf(")");
}
void deal(long long &a1,long long &a2)
{
if(a2<0 && a1>=0)
{
a1=(-1)*a1;
a2=(-1)*a2;
}
else if(a1< 0 && a2<0)
{
a1=(-1)*a1;
a2=(-1)*a2;
}
}
int main()
{
long long a1,a2,a3,a4,b1,b2,b3,b4;
long long c1,c2,c3,c4,c5;
long long gys;
scanf("%lld/%lld",&a1,&a2);
deal(a1,a2);
gys=getgys(a1,a2);
a1=a1/gys;
a2=a2/gys;
scanf("%lld/%lld",&b1,&b2);
deal(b1,b2);
gys=getgys(b1,b2);
b1=b1/gys;
b2=b2/gys;
putnum(a1,a2);
printf(" + ");
putnum(b1,b2);
printf(" = ");
c1=a1*b2+a2*b1;
c2=a2*b2;
gys=getgys(c1,c2);
c1=c1/gys;
c2=c2/gys;
putnum(c1,c2);
cout<<endl;
putnum(a1,a2);
printf(" - ");
putnum(b1,b2);
printf(" = ");
c1=a1*b2-a2*b1;
c2=a2*b2;
gys=getgys(c1,c2);
c1=c1/gys;
c2=c2/gys;
putnum(c1,c2);
cout<<endl;
putnum(a1,a2);
printf(" * ");
putnum(b1,b2);
printf(" = ");
c1=a1*b1;
c2=a2*b2;
gys=getgys(c1,c2);
c1=c1/gys;
c2=c2/gys;
putnum(c1,c2);
cout<<endl;
putnum(a1,a2);
printf(" / ");
putnum(b1,b2);
printf(" = ");
c1=a1*b2;
c2=a2*b1;
deal(c1,c2);
gys=getgys(c1,c2);
c1=c1/gys;
c2=c2/gys;
putnum(c1,c2);
cout<<endl;
return 0;
}
PAT 1088. Rational Arithmetic (20) 分数模拟计算+字符串处理
最新推荐文章于 2020-02-24 14:10:42 发布