PTA中遇到了一题分数的加减法,看了网上了一些解法以后想到了运算符重载。
对于分数的加减乘除操作,都可以通过重载运算符来简化计算,且代码较短,可读性较高,重载操作符必须传参类型为‘类’,且必须在类里面申明该重载运算符。
基本框架如下:
class A{
int numerator;//分子
int denominator;//分母
A(int numerator,int denominator);
A operator+(A rsh);//重载运算符申明
};
A A::operator+(A rsh){
//pass
return A;
}
对于分数,可以对分母和分子分别进行运算再将同时处以最大公约数,就可以得到最简分数的结果。
注意点:
1.初始化一个sum时不能将denominator初始化为0,这不符合实际。
2.输出时要考虑numerator=0和denominator=1的情况,不能直接输出。
#include<iostream>
#include<cmath>
class Fraction {
public:
int fenmu;
int fenzi;
void simplify();
Fraction(int x,int y);
Fraction operator+(Fraction data);
};
Fraction::Fraction(int x, int y) {
fenzi = x;
fenmu = y;
}
void Fraction::simplify() {//化简分数
int t,x=fenzi,y=fenmu;
while (y != 0) {//求最大公约数
t = x % y;
x = y;
y = t;
}
fenzi /= x;
fenmu /= x;
}
Fraction Fraction::operator + (Fraction data) {//重载运算符
Fraction sum(0,1);
sum.fenzi = fenzi * data.fenmu + fenmu * data.fenzi;
sum.fenmu = fenmu * data.fenmu;
sum.simplify();
return sum;
}
int main() {
int num;
Fraction sum(0, 1);
std::cin >> num;
for (int i = 0; i < num; i++) {
char temp;
int x, y;
std::cin >> x >> temp >> y;
Fraction rsh(x, y);
sum = sum + rsh;
}
if (std::abs(sum.fenzi) < std::abs(sum.fenmu)&&sum.fenzi!=0)//分子为0时比任何数都小,所以要排除
std::cout << sum.fenzi << '/' << sum.fenmu;
else if (sum.fenzi % sum.fenmu == 0)
std::cout << sum.fenzi / sum.fenmu;
else
std::cout <<sum.fenzi/sum.fenmu<<' ' <<sum.fenzi%sum.fenmu << '/' << sum.fenmu;
}