/*所有的加减乘除其实都很好计算
这个题的难点在于输出格式的确定func函数用来确认输出格式
*/
#include<iostream>
#include<cmath>
using namespace std;
long long a,b,c,d;
//求最大公约数算法
void func(long long m,long long n);
long long gcd(long long t1, long long t2) {
return t2 == 0 ? t1 : gcd(t2, t1 % t2);
}
void func(long long m,long long n)
{
if(m==0)
{
printf("0");
return;
}
if(n==0)
{
printf("Inf");
return;
}
//判断是否是负的(负的要带括号) 不能用相乘去判断 因为long long范围有限
bool flag = ((m>0&&n<0)||(m<0&&n>0));
//转换为正数 目的方便调整输出格式
m=abs(m);
n=abs(n);
long long x = m/n;
printf("%s",flag?"(-":"");
if(x!=0) printf("%lld",x);
if(m%n==0)//无余数 有余数要考虑生成新的分数前提是还要输出带分数的前面那一位
{
if(flag) printf(")");
return;
}
if(x!=0)
printf(" ");
m=m-x*n;
//最后输出之前要判断化简是否
long long t = gcd(m,n);
m=m/t;n=n/t;
printf("%lld/%lld%s",m,n,flag?")":"");
}
int main(){
scanf("%lld/%lld %lld/%lld",&a,&b,&c,&d);
func(a,b);printf(" + ");func(c,d);printf(" = ");func(a*d+b*c,b*d);printf("\n");
func(a,b);printf(" - ");func(c,d);printf(" = ");func(a*d-b*c,b*d);printf("\n");
func(a,b);printf(" * ");func(c,d);printf(" = ");func(a*c,b*d);printf("\n");
func(a,b);printf(" / ");func(c,d);printf(" = ");func(a*d,b*c);printf("\n");
return 0;
}
PAT乙级 有理数四则运算(求最大公约数值得学习)这题关键就是格式的处理
最新推荐文章于 2021-12-10 20:14:53 发布