题目:
相信同学们对复数运算符重载已经相当熟悉啦,那今天那我们来看看分数又该如何处理呢?定义一个分数类FS,有私有成员分子fz,分母fm。另有公有成员函数FS operator + (const FS &f)对运算符“+”进行重载,实现两个分数相加。题目首先给出一个整型数n,紧跟着2n行输入,输入形如3z4m,代表分子为3,分母为4。其中分母不为0,输入时分母可以为负数,但输出时分母必须为正数。 要求对分数进行两两求和,并化简。(备注说明:分数为0时,表示成0z1m,如果结果为负数,那么分子取负数,分母为正数)
示例如下:
输入:
3
4z9m
2z9m
4z5m
5z4m
2z-5m
1z-5m
输出:
2z3m
41z20m
-3z5m
代码:
#include <iostream>
#include <cmath>
//#define SIZE 20
class FS;
using namespace std;
int minfm(int x, int y);
int location(string n,char a){ //找出'm' 'z' 位置
for (int i = 0; i < n.length();i++){
if(n[i]==a){
return i;
}
}
}
void fzfm(FS &f, int l, int r);
class FS{
string a;
public:
int fz=0, fm=0;
FS() {}
friend istream &operator >>(istream &is,FS &f){ //输入重载
is >> f.a;
return is;
}
friend void operator +(FS &f1,FS &f2){ //相加结果储存在第一个FS类中
int left, right;
//int fz1, fz2, fm1, fm2;
left = location(f1.a, 'z'); //'z'的位置
right = f1.a.length() - 1; //'m'的位置
fzfm(f1, left, right); ////求出分子分母(转为int型
left = location(f2.a, 'z');
right = f2.a.length() - 1;
fzfm(f2, left, right);
addSimple(f1, f2);
}
friend void fzfm(FS &f, int l, int r);
friend void addSimple(FS &f1, FS &f2);
friend int minfm(int x, int y);
};
void addSimple(FS &f1, FS &f2){ //求和+化简
int temp = abs(f1.fm * f2.fm /minfm(f1.fm, f2.fm)); //最小公倍数
//int temp1 = f1.fm * f2.fm / temp;
if(f1.fm<0){ //分母符号转到分子
f1.fm = -f1.fm;
f1.fz = -f1.fz;
}
if(f2.fm<0){
f2.fm = -f2.fm;
f2.fz = -f2.fz;
}
f1.fz *= temp / f1.fm; //通分
f2.fz *= temp / f2.fm;
f1.fz += f2.fz; //分子相加并化简
f1.fm = temp;
temp = minfm(f1.fz, temp);
f1.fz /= temp;
f1.fm /= temp; //
}
int minfm(int x,int y){ //最大公约数
int temp=x%y;
//int _x = x, _y = y;
while(temp){
x = y;
y = temp;
temp = x % y;
}
return abs(y);
}
void fzfm(FS &f,int l,int r){ //求出分子分母(int 型
//int sum = 0;
for (int i = l - 1,k=1; i >= 0;i--,k*=10){
if(f.a[i]=='-')
f.fz = -f.fz;
else
f.fz += (f.a[i] - '0') * k;
}
for (int i = r - 1,k=1; i >l;i--,k*=10){
if(f.a[i]=='-')
f.fm = -f.fm;
else
f.fm += (f.a[i] - '0') * k;
}
}
int main(){
int n;
cin >> n;
FS fs[2 * n];
for (int i = 0; i < n;i++){
cin >> fs[2 * i] >> fs[2 * i + 1];
fs[2 * i] + fs[2 * i + 1];
}
for (int i = 0; i < n;i++)
cout << fs[2 * i].fz << "z" << fs[2 * i].fm << "m" << endl;
}