A级81题笔记
原题链接
比较简单的一道题,分数的加减法运算。下面给出我自己的accept代码。
#include<stdio.h>
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
int gcd(long int a, long int b) {
if (b == 0)
return a;
else
return gcd(b, a%b);
}
class FractionNumber {
public:
long long up, down;
FractionNumber() {
up = 0, down = 1;
}
};
FractionNumber reduction(FractionNumber result) {
if (result.down < 0) {
result.up = -result.up;
result.down = -result.down;
}
if (result.up == 0)
result.down = 1;
else {
int d = gcd(abs(result.up), abs(result.down));
result.up /= d;
result.down /= d;
}
return result;
}
FractionNumber add(FractionNumber a, FractionNumber b) {
FractionNumber result;
result.up = a.up*b.down + b.up*a.down;
result.down = a.down*b.down;
return reduction(result);
}
void showResult(FractionNumber r) {
r = reduction(r);
if (r.down == 1)
cout << r.up << endl;
else if (abs(r.up) > r.down)
printf("%lld %lld/%lld\n", r.up / r.down, abs(r.up) % r.down, r.down);
else
cout << r.up << "/" << r.down << endl;
}
int main() {
FractionNumber result;
FractionNumber temp;
int number = 0;
cin >> number;
for (int i = 0; i < number ; i++) {
scanf("%lld/%lld", &temp.up, &temp.down);
result = add(result, temp);
}
showResult(result);
return 0;
}
注意点:
- 可能又是只有我一个人犯这样的错误……数据定义成什么类型,就最好用什么类型进行接受存储。例如:定义a为long long类型的数据,就记得是要用%lld进行scanf或者printf,别偷懒用%ld。在这段代码中要是没有准确使用会导致出现一堆奇怪的数字。
- 由于分数运算涉及乘法,对于数据类型的定义应该使用long long类。题目中所给的范围是在long int内,相乘的话是会需要long long类型的。
- 分数约分的实现方法:
- 当检测到分母为负时,统一转化为分子为负的情况。
- 当分子为0时,统一将分母定义为1。
- 求出分子分母取绝对值时的最大公约数,再同时除以公约数进行约分。