分数运算问题

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;
}
...全文
142 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;
}

内容概要:本文详细介绍了利用Simulink进行变压器开路试验的电路连接配置与仿真实现方法,重点在于通过仿真手段还原实际电力系统中变压器在空载条件下的电气特性,从而深入理解其工作原理与性能表现。文章作为电力系统仿真系列研究的一部分,系统阐述了从电路模型搭建、参数设定、仿真运行到结果分析的完整流程,突出展示了MATLAB/Simulink在电力设备建模与教学科研中的强大功能与应用价值。; 适合人群:具备电力系统基础知识,熟悉MATLAB/Simulink仿真环境,从事电气工程、自动化及相关领域的研发人员,以及高年级本科生和研究生。; 使用场景及目标:①掌握变压器开路试验的基本原理与Simulink仿真建模的具体步骤;②通过仿真实验深入理解空载电流、铁芯损耗及励磁特性等关键参数的物理意义;③为后续开展变压器短路试验、暂态过程分析以及其他电力设备的仿真研究奠定理论与实践基础。; 阅读建议:建议结合Simulink软件动手实践,逐步构建并调试电路模型,重点关注各元件参数的设置方法与测量模块的应用技巧,同时推荐参考文中提及的其他相关仿真案例进行拓展学习,以全面提升对电力系统仿真实践的整体认知与操作能力。

65,211

社区成员

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

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