有理数运算重载

要求:有理数为最简有理数,若分子与分母整除输出整数。

思想总结:

简单代码思想:
1.有理数简化: 判断分子分母大小,取较小值作为辅助变量,用循环for( i=min; i>1; i-- )判断分子分母同时%i,判断余数,当余数为0表示有公因数,且最大公约数将是第一个被提取出。
2.有理数加减:判断操作数双方分母是否相同,用累加方式找最小公倍数,直到双方分母相同,在对分子进行相加减。
3.整数输出:判断分子是否能整除分母,若余数为0,则满足条件。
4.打印:调用行为print,依次对分子分母根据格式 (分子 “/” 分母 )进行输出

代码优化:
1.有理数简化:采用欧立德算法,循环对除数进行求模,在将被除数作为除数,直到余数为0,即获得最大公约数,即当前除数为最大公因数。
2.有理数加减:不用找最小公倍数,直接用公式,这样操作只需一步,效率高。
例如:a/b + a1/b1 = (a * b1 + a1 * b) / b*b1
3.打印:将std类中的左移运算符<<重载,使它能够输出Ration格式的数据。

初版本

#include <iostream>
#include <string>
#include <stdlib.h>
class Ration
{public:Ration();Ration(int d, int m);Ration operator+(Ration d);Ration operator-(Ration d);Ration operator*(Ration d);Ration operator/(Ration d);void print();
private:int molecule;int denominator;
};Ration::Ration()
{denominator = 0;molecule = 0;
}Ration::Ration(int d, int m)
{denominator = d;molecule = m;
}Ration Ration::operator+(Ration d)
{Ration c;int mtmp = molecule, dtmp = denominator;int mtmp2 = d.molecule, dtmp2 = d.denominator;while( mtmp != mtmp2 ){if(mtmp < mtmp2){mtmp += molecule;dtmp += denominator;}else if( mtmp > mtmp2 ){mtmp2 += d.molecule;dtmp2 += d.denominator;}}c.molecule = mtmp;c.denominator = dtmp + dtmp2;return c;
}Ration Ration::operator-(Ration d)
{Ration c;int mtmp = molecule, dtmp = denominator;int mtmp2 = d.molecule, dtmp2 = d.denominator;while( mtmp != mtmp2 ){if(mtmp < mtmp2){mtmp += molecule;dtmp += denominator;}else if( mtmp > mtmp2 ){mtmp2 += d.molecule;dtmp2 += d.denominator;}}c.molecule = mtmp;c.denominator = dtmp - dtmp2;return c;
}Ration Ration::operator*(Ration d)
{Ration c;c.molecule = molecule * d.molecule;c.denominator = denominator * d.denominator;return c;
}Ration Ration::operator/(Ration d)
{Ration c;c.molecule = molecule * d.denominator;c.denominator = denominator * d.molecule;return c;
}void Ration::print()
{int i=0;if( abs(molecule) > abs(denominator) ){for(i=abs(denominator); i>1; i--){if( denominator % i == 0 && molecule % i == 0 ){molecule /= i;denominator /= i;break;}}}else{for(i=abs(molecule); i>1; i--){if( denominator % i == 0 && molecule % i == 0 ){molecule /= i;denominator /= i;break;}}}if( denominator % molecule == 0 )std::cout << "整数:" << denominator << std::endl;elsestd::cout << denominator << " / " << molecule << std::endl;
}int main()
{Ration r1(3,8),r2(13,8),r3;r3 = r1 + r2;r3.print();r3 = r1 - r2;r3.print();r3 = r2 * r1;r3.print();r3 = r2 / r1;r3.print();std::cin.get();return 0;
}

优化版本

#include <iostream>
#include <string>
#include <stdlib.h>class Ration
{public:Ration();Ration(int m, int d);Ration operator+(Ration d);Ration operator-(Ration d);Ration operator*(Ration d);Ration operator/(Ration d);
private:void normalize();//简化int molecule;//分子int denominator;//分母friend std::ostream& operator<<(std::ostream &os, Ration f);
};Ration::Ration()
{molecule = 0;denominator = 0;
}Ration::Ration(int m, int d)
{molecule = m;denominator = d;normalize();//简化
}void Ration::normalize()
{//分母不为负数,若为负数则将符号提到分子if( denominator < 0 ){denominator = -denominator;molecule = -molecule;}//欧几里德算法int a = abs( molecule );int b = abs( denominator );//最大公约数while( b > 0 ){int t = a%b;a=b;b=t;}molecule /= a;denominator /= a;
}Ration Ration::operator+(Ration d)
{int a = molecule, a1 = denominator;int b = d.molecule, b1 = d.denominator;int c = a*b1 + a1*b;int f = a1 * b1;return Ration(c, f);
}Ration Ration::operator-(Ration d)
{int a = molecule, a1 = denominator;int b = d.molecule, b1 = d.denominator;int c = a*b1 - a1*b;int f = a1 * b1;return Ration(c, f);
}Ration Ration::operator*(Ration d)
{int a = molecule, a1 = denominator;int b = d.molecule, b1 = d.denominator;int c = a * b;int f = a1 * b1;return Ration(c, f);
}Ration Ration::operator/(Ration d)
{int a = molecule, a1 = denominator;int b = d.molecule, b1 = d.denominator;int c = a * b1;int f = a1 * b;return Ration(c, f);
}void Ration::print()
{if( molecule % denominator == 0 )std::cout << "整数:" << molecule << std::endl;elsestd::cout << molecule << "/" << denominator << std::endl;
}std::ostream &operator<<(std::ostream &os, Ration f);int main()
{Ration r1(3,8),r2(13,8),r3;std::cout << r1 << "+" << r2 << "=" << (r1+r2) << std::endl;std::cout << r1 << "-" << r2 << "=" << (r1-r2) << std::endl;std::cout << r1 << "*" << r2 << "=" << (r1*r2) << std::endl;std::cout << r1 << "/" << r2 << "=" << (r1/r2) << std::endl;return 0;
}std::ostream &operator<<(std::ostream &os, Ration f)
{os << f.molecule << "/" << f.denominator;return os;
}

C++ 有理数运算符重载相关推荐

  1. C++学习笔记(10)运算符重载,友元函数,友元类

    c++允许我们为运算符定义专门的函数,这被称为运算符重载: 运算符可以简化字符串的操作,'+',以及使用关系运算符比较字符串,[ ]运算符访问向量中的元素: 例如: #include <iost ...

  2. 运算符重载 - C++快速入门25

    运算符重载 让编程改变世界 Change the world by program 运算符重载 所谓重载,就是重新赋予新的含义.函数重载是对一个已有的函数赋予新的含义,使之实现新功能. 其实运算符也可 ...

  3. 运算符重载例子分数加减乘除,赋值,输入输出比较大小

    把老师代码上传一下,方便用移动设备时刻查看 //有理数类的运算符重载 #include <iostream> using namespace std; class Rational{pri ...

  4. c++重载(以运算符重载为主)

    重载(OverLoading)是面向对象程序设计多态性的一种体现.所谓重载,是指"同一标识符"在同一作用域的不同场合具有不同的语义,这个标识符可以是函数名或运算符.也就是说,重载可 ...

  5. groovy–运算符重载

    Groovy支持运算符重载,各种运算符被映射到普通的java对象的方法调用,这就使得开发者可以利用运算符重载的优势来编写自己的Java或者groovy对象. 下面的表格描述了groovy中的操作符所映 ...

  6. c++运算符重载总结

    c++的一大特性就是重载(overload),通过重载可以把功能相似的几个函数合为一个,使得程序更加简洁.高效.在c++中不止函数可以重载,运算符也可以重载.由于一般数据类型间的运算符没有重载的必要, ...

  7. c++重载运算符_C/C++编程笔记:运算符重载丨重载C++中的New和Delete运算符

    new和delete运算符也可以像C ++中的其他运算符一样重载.New和Delete运算符可以全局重载,也可以在特定类中重载. (1)如果使用某个类的成员函数来重载这些运算符,则意味着这些运算符仅针 ...

  8. C++运算符重载形式--成员函数or友元函数?

    1.C++操作符重载形式-成员函数or友元函数 1.对运算符重载,需要坚持四项基本原则: 不可臆造运算符: 运算符原有操作数的个数.优先级和结合性不能改变: 操作数中至少一个是自定义类型: 保持重载运 ...

  9. C++中运算符重载需要遵循的规则

    一.C++中运算符重载需要遵循的规则 1.并不是所有的运算符都可以重载.能够重载的运算符包括: + - * / % ^ & | ~ ! = < > += -= *= /= %= ^ ...

  10. C++中的运算符重载基础

    1.C++中的运算符重载基础 所谓重载,就是赋予新的含义.函数重载(Function Overloading)可以让一个函数名有多种功能,在不同情况下进行不同的操作.运算符重载(Operator Ov ...

最新文章

  1. python学习札记20210123
  2. SylixOS DSP upgrade命令解析
  3. 氮化镓充电器哪家做得好_氮化镓充电头推荐、100元能买到那些大品牌氮化镓充电器?...
  4. SQL调优:带函数的谓词导致CBO Cardinality计算误差
  5. linux强行卸载qt,Linux下卸载QT SDK
  6. 学计算机之路写一篇作文,我的学习之路作文(2篇)
  7. ffmpeg视频裁剪
  8. 2.阿里实人认证 .net 准备工作2 转换demo
  9. 车载人机交互语音android,手机与车机如何实现语音智能交互?
  10. cpan mysql dbd_Perl中DBI、DBD::mysql模块的安装
  11. Win7超级终端查看单片机printf输出
  12. 构建U盘启动的嵌入式linux
  13. latex 图片、表格、定义、理论 简单示例
  14. C. Anu Has a Function
  15. Macbook pro 14休眠大量耗电
  16. 计算机视觉-局部图像描述子
  17. [线段树][单调栈] BZOJ 4527 CF 407E: K-D-Sequence
  18. Linux系统调用号列表、系统调用的三种方式
  19. 动手学深度学习之Task09:目标检测基础;图像风格迁移;图像分类案例1
  20. MATLAB value和handle类的区别

热门文章

  1. 2016奇虎360研发工程师内推笔试编程题 - 题解
  2. linux 前台和后台,Linux前台进程与后台进程的区别
  3. CST常用应用的求解器
  4. PLC控制系统接地要求
  5. OpenCV 3.0 高动态范围图像
  6. 带你读论文系列之计算机视觉--Inception V4
  7. gif制作软件 ScreenToGif
  8. 双系统、多系统快速切换
  9. [Vuetify] Multiple instances of Vue detected
  10. hive动态分区 MapReduce 虚拟内存不足