PAT A 1088 Rational Arithmetic (20 分)
### 一、思路构造输出函数,格式化输出分数:1、分子或分母为零,输出0或Inf且不再进行其他处理2、若分子分母均非零,将格式统一为分子分母均为正数,符号单独存储输出3、输出分数:(1)若有整数部分,输出整数(2)若有整数部分且有分数部分,输出空格(3)若有分数部分,输出分数```pythonvoid output(long long a, long long b){if( !b || !a ){
·
一、思路
构造输出函数,格式化输出分数:
1、分子或分母为零,输出0或Inf且不再进行其他处理
2、若分子分母均非零,将格式统一为分子分母均为正数,符号单独存储输出
3、输出分数:
(1)若有整数部分,输出整数
(2)若有整数部分且有分数部分,输出空格
(3)若有分数部分,输出分数
测试点2答案错误:注意符号判断时使用if(up * down < 0) sign = 1;
方式,会在up*down溢出时判断错误。
测试点3答案错误:用2/2 1/2试试
二、代码
#include <cstdio>
#include <algorithm>
using namespace std;
int gcd(long long a, long long b)
{
return !b ? a : gcd(b, a % b);
}
void output(long long a, long long b)
{
if( !a || !b )
{
printf("%s", !b ? "Inf":"0");
return;
}
int sign = ((a >= 0) != (b >= 0)), div = gcd(abs(a), abs(b));
a = abs(a / div), b = abs(b / div);
printf("%s", sign ? "(-":"");
if( a / b )
printf("%lld%s", a / b, a % b ? " ":"");
if( a % b )
printf("%lld/%lld", a % b, b);
printf("%s", sign ? ")":"");
}
int main()
{
long long a1, b1, a2, b2;
scanf("%lld/%lld %lld/%lld", &a1, &b1, &a2, &b2);
output(a1, b1), printf(" + "), output(a2, b2), printf(" = "), output(a1 * b2 + a2 * b1, b1 * b2), printf("\n");
output(a1, b1), printf(" - "), output(a2, b2), printf(" = "), output(a1 * b2 - a2 * b1, b1 * b2), printf("\n");
output(a1, b1), printf(" * "), output(a2, b2), printf(" = "), output(a1 * a2,b1 * b2), printf("\n");
output(a1, b1), printf(" / "), output(a2, b2), printf(" = "), output(a1 * b2, b1 * a2), printf("\n");
}
更多推荐
所有评论(0)