当前位置: 代码迷 >> 综合 >> 1034?有理数四则运算?(20分)
  详细解决方案

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

热度:52   发布时间:2023-12-06 21:47:26.0

 

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

输入格式:

输入在一行中按照 a1/b1 a2/b2 的格式给出两个分数形式的有理数,其中分子和分母全是整型范围内的整数,负号只可能出现在分子前,分母不为 0。(对输入的分数进行化简gcd,因为分母为1的时候只用输出分子,所以当分子是0的时候,不论分母如何,都只用输出0即可,所以当分子为0,让其分母变为1,可以化简计算)

输出格式:

分别在 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

运算的时候以假分数或分数的形式运算,输出的时候才以真分数的形式输出 

一个测试点一直过不去。。。试了半天不知道为啥。。。。。原来是 Inf 不是 inf。。。。。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<cmath>
#include<string>using namespace std;
const int maxn=10010;
const int N=10;
typedef long long LL;LL gcd(LL a,LL b){return b == 0 ? a : gcd(b,a%b);
}struct node{LL up,down;
};node jia,jian,cheng,chu;node reduction( node a){//化简分数 有 三种情况 1.分母为负 2.分子为0 3.分母为0//但在本题中题目已经限制分母不为负数不为零 //又由于除法运算的时候还会引起 1 这种情况 if( a.up == 0 && a.down == 0) ;else if( a.up == 0 ) a.down=1;else {if( a.down<0 ){a.up *=-1;a.down *=-1;}LL d = gcd( abs(a.up),abs(a.down));a.up /= d;a.down /= d;}return a;
}void print(node a){a = reduction(a);if(a.up<0) putchar('(');if( a.down == 1) printf("%lld",a.up);else if(abs(a.up)<a.down) printf("%lld/%lld",a.up,a.down);else{printf("%lld %lld/%lld",a.up/a.down,abs(a.up)%a.down,a.down );;}if(a.up<0) putchar(')'); 
}void func(node a,node b){jia.up = a.up * b.down + b.up * a.down ;jia.down = a.down * b.down;jian.up = a.up * b.down - b.up * a.down ;jian.down = a.down * b.down;cheng.up = a.up * b.up;cheng.down = a.down * b.down;chu.up = a.up*b.down;chu.down = a.down*b.up;
}void show(node a,node b){print(a); printf(" + "); print(b); printf(" = "); print(jia); puts("");print(a); printf(" - "); print(b); printf(" = "); print(jian); puts("");print(a); printf(" * "); print(b); printf(" = "); print(cheng); puts("");print(a); printf(" / "); print(b); printf(" = "); if(chu.down == 0) puts("Inf");else{print(chu); puts("");	}
}int main(){node a,b;scanf("%lld/%lld %lld/%lld",&a.up,&a.down,&b.up,&b.down);a = reduction(a); b = reduction(b) ; func(a,b);show(a,b);return 0;
}