A级原题链接
B级原题链接
很简单的一道题,只是要写的东西有点多,只要基本懂小学数学应该都能明白的题目。
下面给出我自己的accept代码。
#include<stdio.h>
#include<iostream>
using namespace std;
long long gcd(long long a, long long b) {
if (b == 0)
return a;
else return gcd(b, a%b);
}
class Fraction {
public:
long long up, down;
Fraction() {
this->up = 0;
this->down = 1;
}
};
Fraction reduction(Fraction fraNumber) {
if (fraNumber.down < 0) {
fraNumber.up = -fraNumber.up;
fraNumber.down = -fraNumber.down;
}
if (fraNumber.up == 0) {
fraNumber.down = 1;
}
else if (fraNumber.down == 0) {
fraNumber.up = 0;
}
else {
int Divisor = gcd(abs(fraNumber.up), abs(fraNumber.down));
fraNumber.up /= Divisor;
fraNumber.down /= Divisor;
}
return fraNumber;
}
void toPrint(Fraction fraNubmer) {
fraNubmer = reduction(fraNubmer);
if (fraNubmer.down == 1) {
if (fraNubmer.up >= 0)
printf("%lld", fraNubmer.up);
else
printf("(%lld)", fraNubmer.up);
}
else if (fraNubmer.down == 0) {
printf("Inf");
}
else if (abs(fraNubmer.up) > fraNubmer.down) {
if (fraNubmer.up >= 0)
printf("%lld %lld/%lld", fraNubmer.up / fraNubmer.down, abs(fraNubmer.up) % fraNubmer.down, fraNubmer.down);
else
printf("(%lld %lld/%lld)", fraNubmer.up / fraNubmer.down, abs(fraNubmer.up) % fraNubmer.down, fraNubmer.down);
}
else {
if (fraNubmer.up >= 0)
printf("%lld/%lld", fraNubmer.up, fraNubmer.down);
else
printf("(%lld/%lld)", fraNubmer.up, fraNubmer.down);
}
}
Fraction add(Fraction a, Fraction b) {
Fraction result;
result.up = a.up*b.down + a.down*b.up;
result.down = a.down*b.down;
return reduction(result);
}
Fraction Abstract(Fraction a, Fraction b) {
Fraction result;
result.up = a.up*b.down - a.down*b.up;
result.down = a.down*b.down;
return reduction(result);
}
Fraction mutiple(Fraction a, Fraction b) {
Fraction result;
result.up = a.up*b.up;
result.down = a.down*b.down;
return reduction(result);
}
Fraction Division(Fraction a, Fraction b) {
Fraction result;
result.up = a.up*b.down;
result.down = a.down*b.up;
return result;
}
int main() {
Fraction a, b, result;
scanf("%lld/%lld", &a.up, &a.down);
scanf("%lld/%lld", &b.up, &b.down);
result = add(a, b);
toPrint(a), cout << " + ", toPrint(b), cout << " = ", toPrint(result), cout << endl;
result = Abstract(a, b);
toPrint(a), cout << " - ", toPrint(b), cout << " = ", toPrint(result), cout << endl;
result = mutiple(a, b);
toPrint(a), cout << " * ", toPrint(b), cout << " = ", toPrint(result), cout << endl;
result = Division(a, b);
toPrint(a), cout << " / ", toPrint(b), cout << " = ", toPrint(result), cout << endl;
return 0;
}
基本思路
- 用辗转相除法写最大公约数函数,约分函数要用到。
- 约分函数需要有的四个步骤:
- 判断分母是否为负,是则将分子与分母取相反数。
- 判断分子是否为零,是则将分母取1。
- 判断分母是否为零,是则将分子取零或者不做操作。
- 算出分子分母取绝对值的最大公约数,再将分子分母除以最大公约数。
- 输出函数的注意点:
- 先约分,再输出。
- 输出分四种情况,一是整数,二是不合法分数,三是假分数,四是真分数。
- 记得符号输出是带括号的。
- 加法函数是小学生的运算法则,记得返回约分后的数。
- 减法函数是小学生的运算法则,记得返回约分后的数。
- 除法函数是小学生的运算法则,记得返回约分后的数。分母为零可以交给约分函数处理。
- 乘法函数是小学生的运算法则,记得返回约分后的数。
心得
是比较简单的一道题目,少见的几道可以一次ac的题目。思路清晰,一口气从头写到尾简直舒服。调错也只是一些输出错误。虽然代码量有点大?不知道能不能缩减一点。