分数运算问题

Never妥协 2019-11-09 11:43:14
帮忙提供下思路,有点迷茫
在我的下面这个程序的基础下,不做大的改动,如何以以下两种输入求得分数运算结果,,

RNumber.h文件
代码如下:

#ifndef _RNUMBER_
#define _RNUMBER_
#include<iostream>
using namespace std;
class RNumber
{
int numerator,//分子
denominator;//分母
public:
void reduction();//约分
void setNumerator(int m) { numerator = m; }//设置分子
void setDenominator(int n) { denominator = n; }//设置分母


int getNumerator()const { return numerator; }//返回分子
int getDenominator()const { return denominator; }//返回分母

friend RNumber operator+(RNumber fraction1, RNumber fraction2);
friend RNumber operator-(RNumber fraction1, RNumber fraction2);
friend RNumber operator*(RNumber fraction1, RNumber fraction2);
friend RNumber operator/(RNumber fraction1, RNumber fraction2);

friend istream& operator>>(istream& in, RNumber &a);
friend ostream& operator<<(ostream& out, RNumber &a);


};
void RNumber::reduction()
{

int n = numerator;
if (n != 0)
{
//排除分数为负数的情况
if (n < 0)
{
n = abs(n);
}
int d = denominator;
if (d < 0)
{
d = abs(d);
}
while (n!=0&&n != d)//若分子为0,不约分
{//辗转相减法求公约数
if (n > d)
n-=d;
else
d-=n;
}
numerator /= n;
denominator /= d;
}



}
istream& operator>>(istream &in, RNumber& a)
{
int m, //记录分子
n;//记录分母
char ch;
in >> m >> ch >> n;
if (n == 0)
{
cout<<"分母不能为0!\n";
exit(0);
}
a.setNumerator(m);
a.setDenominator(n);
a.reduction();
return in;
}
ostream& operator<<(ostream& out, RNumber &a)
{
out << a.numerator << "/" << a.denominator;
return out;
}
RNumber operator+(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator*fraction2.denominator;
end.numerator = fraction1.denominator*fraction2.numerator + fraction1.numerator*fraction2.denominator;
end.reduction();
return end;
}
RNumber operator-(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator*fraction2.denominator;
end.numerator = fraction1.numerator*fraction2.denominator - fraction1.denominator*fraction2.numerator;
end.reduction();
return end;
}
RNumber operator*(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator * fraction2.denominator;
end.numerator = fraction2.numerator * fraction1.numerator;
end.reduction();
return end;
}
RNumber operator/(RNumber fraction1, RNumber fraction2)
{
RNumber end;
end.denominator = fraction1.denominator * fraction2.numerator;
end.numerator = fraction1.numerator * fraction2.denominator;
end.reduction();
return end;
}

#endif




主函数文件
#include<iostream>
#include"RNumber.h"
using namespace std;
int main()
{
RNumber fraction1;//分数运算左操作数
RNumber fraction2;//右操作数
char ch;//运算符
RNumber end;//结果
cout << "请输入表达式:";
cin >> fraction1>>ch>>fraction2;//cin>>fraction1调用重载>>运算符,>>fraction2调用重载运算符>>,给分数的分母分子相应的数
cout << fraction1 << ch << fraction2 << "=";//输出格式,调用重载<<运算符,以分数格式输出
switch (ch)
{
case '+':end = fraction1 + fraction2;//调用重载+
break;
case '-':end = fraction1 - fraction2;//调用重载-
break;
case '*':end = fraction1 * fraction2;//调用重载*
break;
case '/':end = fraction1 / fraction2;//调用重载/
break;
}
if (abs(end.getNumerator()) % abs(end.getDenominator()) == 0)//处理结果为整数的情况
{
cout << end.getNumerator() / end.getDenominator();
}
else
cout << end;//结果为分数
return 0;
}
...全文
94 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Never妥协 2019-11-09
  • 打赏
  • 举报
回复
引用 4 楼 智者知已应修善业的回复:
用辗转相减法求最大公约数我也写过看https://bbs.csdn.net/topics/394981171
这个不是重点,求最大公约数的方法好几种,无非是效率可能不一样,在这儿就是为了给分数约分,达到目的就成
  • 打赏
  • 举报
回复
用辗转相减法求最大公约数我也写过看https://bbs.csdn.net/topics/394981171
Never妥协 2019-11-09
  • 打赏
  • 举报
回复
引用 1 楼 智者知已应修善业 的回复:
看不懂这个在做虾米

        while (n!=0&&n != d)//若分子为0,不约分
        {//辗转相减法求公约数
            if (n > d)
                n-=d;
            else
                d-=n;
        }
当然,我这个求最大公约数的方法可能效率并不那么高
Never妥协 2019-11-09
  • 打赏
  • 举报
回复
引用 1 楼 智者知已应修善业 的回复:
看不懂这个在做虾米

        while (n!=0&&n != d)//若分子为0,不约分
        {//辗转相减法求公约数
            if (n > d)
                n-=d;
            else
                d-=n;
        }
用辗转相减法求最大公约数,比如4,和6,得到的值为2
  • 打赏
  • 举报
回复
看不懂这个在做虾米

while (n!=0&&n != d)//若分子为0,不约分
{//辗转相减法求公约数
if (n > d)
n-=d;
else
d-=n;
}

64,666

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧