分数类(重载了四则运算、比较运算、输出)_Meloor的博客-程序员秘密_分数类denominator.

技术标签: 分数  algorithm  

 当前版本

重载了四则运算

兼容了与整数的四则运算

重载了比较运算符>,>=,<,<=,==

重载了输出运算符

/*********************************************************************/
class Rational{
public:
    Rational(ll num,ll denomi);
    //运算符重载 
    friend Rational operator+(Rational x,Rational y);
    friend Rational operator-(Rational x,Rational y);
    friend Rational operator*(Rational x,Rational y);        
    friend Rational operator/(Rational x,Rational y);
    //兼容和整数的运算 
    friend Rational operator+(Rational x,ll y);
    friend Rational operator+(ll x,Rational y);
    friend Rational operator-(Rational x,ll y);        
    friend Rational operator-(ll x,Rational y);    
    friend Rational operator*(Rational x,ll y);
    friend Rational operator*(ll x,Rational y);
    friend Rational operator/(Rational x,ll y);        
    friend Rational operator/(ll x,Rational y);
    //重载比较运算符 
    friend bool operator>(Rational x,Rational y);
    friend bool operator<(Rational x,Rational y);
    friend bool operator>=(Rational x,Rational y);
    friend bool operator<=(Rational x,Rational y);
    friend bool operator==(Rational x,Rational y);
    //重载输出运算符 
    friend ostream & operator<<(ostream &out, Rational &obj);
    //gcd函数 
    ll gcd(ll a, ll b){return b ? gcd(b, a % b) : a;}
	//归一化处理,比如将2/16变成1/8
	void normalize();
public:
    ll numerator;//分子
    ll denominator;//分母
}; 
Rational::Rational(ll num=1,ll denomi=1){
    numerator=num;
    denominator=denomi;
    normalize();
} 
void Rational::normalize(){
   	if(denominator<0){//保证分母大于0 
       numerator=-numerator;
       denominator=-denominator;
   	}
	ll a = abs(numerator);
	ll b = abs(denominator);
	//求两个数的最大公约数
	ll gc = gcd(a,b);
	//分子,分母分别除以最大公约数,得到最简式
	numerator/=gc;
	denominator/=gc;
}
//运算符重载 
//a    c     a*d+b*c
//—  + — = ————
//b    d       b*d
Rational operator+(Rational x,Rational y){
 ll a=x.numerator;
 ll b=x.denominator;
 ll c=y.numerator;
 ll d=y.denominator;
 ll e=a*d+c*b;
 ll f=b*d;
 return Rational(e,f);
} 
Rational operator-(Rational x,Rational y){
    y.numerator = -y.numerator;//减相当于加负数
    return x + y;
}
//a    c    a*c
//— * — = ——
//b    d    b*d
Rational operator*(Rational x,Rational y){
    ll a=x.numerator;
    ll b=x.denominator;
    ll c=y.numerator;
    ll d=y.denominator; 
    ll e=a*c;
    ll f=b*d; 
    return Rational(e,f);
}
//a    c    a*d
//— / — = ——
//b    d    b*c
Rational operator/(Rational x,Rational y){
    ll a=x.numerator;
    ll b=x.denominator;
    ll c=y.numerator;
    ll d=y.denominator; 
    ll e=a*d;
    ll f=b*c;
    return Rational(e,f);
}
//兼容和整数的运算 
Rational operator+(Rational x,ll y){
	return x + Rational(y,1); 
}
Rational operator+(ll x,Rational y){
	return Rational(x,1) + y;
}
Rational operator-(Rational x,ll y){
	return x - Rational(y,1);
}      
Rational operator-(ll x,Rational y){
	return Rational(x,1) + y;
}
Rational operator*(Rational x,ll y){
	return x*Rational(y,1); 
}
Rational operator*(ll x,Rational y){
	return Rational(x,1) * y;
}
Rational operator/(Rational x,ll y){
	return x / Rational(y,1);
}      
Rational operator/(ll x,Rational y){
	return Rational(x,1) / y;
}
//比较运算符重载    
bool operator>(Rational x,Rational y){
	Rational cha = x - y;
	return cha.numerator > 0;
} 
bool operator<(Rational x,Rational y){
	Rational cha = x - y;
	return cha.numerator < 0;
} 
bool operator>=(Rational x,Rational y){
	Rational cha = x - y;
	return cha.numerator >= 0;
} 
bool operator<=(Rational x,Rational y){
	Rational cha = x - y;
	return cha.numerator <= 0;
} 
bool operator==(Rational x,Rational y){
	Rational cha = x - y;
	return cha.numerator == 0;
} 
//输出运算符重载 
ostream & operator<<(ostream &out, Rational &obj){
	if(obj.numerator == 0)
		cout<<obj.numerator;
    else if(obj.denominator == 1)
        cout<<obj.numerator;
    else
        cout<<obj.numerator<<'/'<<obj.denominator;
    return out;
}
/***********************************************************/

之前版本

class Rational{
public:
    Rational(ll num,ll denomi);
 
    Rational operator+(Rational x);//运算符重载
    Rational operator-(Rational x);
    Rational operator*(Rational x);
    Rational operator/(Rational x);
    
 	friend ostream & operator<<(ostream &out, Rational &obj);
public:
    ll numerator;//分子
    ll denominator;//分母
 
    void normalize();//归一化处理,比如将2/16变成1/8
 
};
 
Rational::Rational(ll num=1,ll denomi=1)
{
    numerator=num;
    denominator=denomi;
 
    normalize();
}
 
void Rational::normalize()
{
   if(denominator<0)
   {
       numerator=-numerator;
       denominator=-denominator;
   }
//欧几里得算法
    ll a = abs(numerator);
    ll b = abs(denominator);
//求两个数的最大公约数
    while(b>0)
    {
      ll t=a%b;
      a=b;
      b=t;
    }
//分子,分母分别除以最大公约数,得到最简式子
    numerator/=a;
    denominator/=a;
 
}
//a    c   a*d+b*c
//—  + — = ——————
//b    d     b*d
Rational Rational::operator+(Rational x)
{
 ll a=numerator;
 ll b=denominator;
 ll c=x.numerator;
 ll d=x.denominator;
 
 ll e=a*d+c*b;
 ll f=b*d;
 return Rational(e,f);
}
 
Rational Rational::operator-(Rational x)
{
    x.numerator=-x.numerator;//减相当于加负数
 
    return operator+(x);
}
//a    c     a*c
//—  * — = ——————
//b    d     b*d
Rational Rational::operator*(Rational x)
{
    ll a=numerator;
    ll b=denominator;
    ll c=x.numerator;
    ll d=x.denominator;
 
    ll e=a*c;
    ll f=b*d;
 
    return Rational(e,f);
}
//a    c     a*d
//—  / — = ——————
//b    d     b*c
Rational Rational::operator/(Rational x)
{
    ll a=numerator;
    ll b=denominator;
    ll c=x.numerator;
    ll d=x.denominator;
 
    ll e=a*d;
    ll f=b*c;
 
    return Rational(e,f);
}
 
ostream & operator<<(ostream &out, Rational &obj)
{
    //if(numerator%denominator==0)
    //    cout<<numerator/denominator;
    //else
        cout<<obj.numerator<<'/'<<obj.denominator;
        return out;
}

 

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/Meloor/article/details/86777662

智能推荐

Arithmetic第一篇:栈具有FILO(先进后出)的性质,已知栈的输入顺序为123,则输出有多少种_栈输入123输出_bkLion的博客-程序员秘密

初学的时候也有困惑,但现在理解了,所以我想把我的理解方法分享给大家,帮助大家学习:以1开头:123,132两种帮助理解:1进1出2进2出3进3出(输出序列为123);1进1出2进3进3出2出(输出序列为132)以2开头:213,231两种帮助理解:1进2进2出1出3进3出(输出序列为213);1进2进2出3进3出1出(输出序列为231)以3开头:***注意!***只有3...

(Mac) Mac上如何修改本地的hostname_mac修改hostname_在风中的意志的博客-程序员秘密

前言之前运行Spark的时候遇到一个问题. 由于本地hostname不对导致链接连不上. 将记录操作记录于此.操作细节Mac上配置Hostname主要包括2处./etc/hostslocalhost:~ sean$ ls /etc | grep ".*hosts.*"hostshosts.equiv可以看到就只有2个文件. 无hostname文件.localhost:~ sean$ cat /etc/hosts### Host Database## localhost is

eclipse+maven新建项目index.jsp页面报错_Twumf_1997的博客-程序员秘密

错误  The superclass "javax.servlet.http.HttpServlet" was not found on the Java Build Path。解决方法:在pom.xml文件中加入 org.apache.maven.plugins maven-compiler-pl

读《Clean Code 代码整洁之道》之感悟_胖子依然6的博客-程序员秘密

盲目自信,自认为已经敲了几年代码,还看什么整洁之道啊。我那可爱的书架读懂了我的心思,很明事理的保护起来这本小可爱,未曾让它与我牵手最近项目中的 bug 有点多,改动代码十分吃力,每看一行代码都带一句“这是什么XX代码啊,真XX难改”,这样持续了好几天,有天晚上坐在书房回想这几天发生的一切,仰头定睛思考,我终于和它重新确认了眼神股票见涨你知道买了, 汽车撞墙知道拐了, 孩子死了你来...

二叉搜索树 平衡二叉搜索树 红黑树 B树 B+树_b树的查找效率是多少_啦啦拉德玛西亚的博客-程序员秘密

1.二叉搜索树特点:父节点比左大 比右小 缺点:最差情况为链表2.平衡二叉搜索树(AVL)特点:二插搜索树的基础上 保证左右子树的高度差不大于13.红黑树(RBT)特点: 根黑 叶子黑 红的子是黑 路径中黑个数相同使用场景: 查找 排序(中序遍历有序)插入调整: 插入节点是红色更容易满足红黑树性质(路径黑相同) 当插入后,插入节点的父节点是红色(不满足红的子节点都是黑色),那么需要调整红黑树。4.AVL和RBT比较AVL是严格平衡二叉树,插入删除需要多次旋转调整。RBT是

MySQL 启动错误 Starting MySQL. ERROR! The server quit without updating PID file_武凯凯的博客-程序员秘密

在工作中,因为死锁所以重启了一下msyql,命令如下:service mysql stopservice mysql start然后就报错,启动不了,报错信息如下:Starting MySQL. ERROR! The server quit without updating PID file (/usr/local/mysql/data/iZuf635fwy8k6ubk6r9yonZ.pid).各种百度无果,最后发现是在 /usr/local/mysql/ 目录下存在一个 my.cnf 配置文

随便推点

手机信息页面_zhoujianping1的博客-程序员秘密

xmlns:tools="http://schemas.android.com/tools"   android:layout_width="match_parent"   android:layout_height="match_parent"   android:background="@android:color/darker_gray"    android:orienta

最小一乘回归系数估计及其matlab实现,基于Matlab的最小一乘回归的线性规划实现..._weixin_39652154的博客-程序员秘密

五邑大学学报(自然科学版) JOURNAL OF WUYI UNIVERSITY ( Natural Science Edition) 第 20 卷 第 1 期 2006 年 4月 Vol.20 No.1 Apr. 2006 文章编号:1006-7302(2006)01-0005-04 1 基于 Matlab 的最小一乘回归的线性规划实现 肖健华 1,2,杨纬隆 1,2,李军 3 (1. 五邑大学...

Css学习手册之基本篇_weixin_34415923的博客-程序员秘密

2019独角兽企业重金招聘Python工程师标准&gt;&gt;&gt; ...

Oracle RAC Study之--10gR2 RAC环境中在线添加、删除Votedisk和在线替换OCR的探讨_votedisk和ocr 在线替换_客居天涯的博客-程序员秘密

Oracle RAC Study之--10gR2 RAC环境中在线添加、删除Votedisk和在线替换OCR的探讨       这里我们不讨论11gR2 RAC在线添加、删除Votedisk和OCR,在11gR2平台可以非常容易的实现。这里也不讨论Votedisk和OCR的还原,还原操作必须在停止Clusterware的情况下完成。下面以实际的例子讨论10gR2 RAC for Linux环境下,

软考系统架构设计师 - 第 9 章 面向构件的软件设计_架构师 面向构件_94甘蓝的博客-程序员秘密

已阅第9小时和教程。涉及单选题及案例分析题,4-20分。面向构件的软件设计是软件生产线技术、软件工厂技术的重要理论基础。9.1 构件的概念1. 构件的定义是可以实现特定的功能,符合一套接口标准并实现一组接口,在系统中实际存在的可更换的部分。2. 和构件相关的概念介绍模块:本身就可以作为一个最简单的构件构件的规模:在“最大化重用”和语境依赖爆炸性增长之间,找到平衡点,在体系中很好地运行接口:一个已命名的一组操作的结合构件特征:独立部署单元、作为第三方的组装单元、没有(外部的

java php 安全_java比php安全吗_安娜的小岛的博客-程序员秘密

语言选择不决定代码稳定与否与可维护性高低,这两者主要取决于写的代码本身。java是一种工业级的编程语言。无论使用者水平如何,java开发出来的程序不会太差。java安全性1、JAVA是一门强类型的静态语言,几乎什么都能做。而PHP只是一个超文本解释器而已,它的诞生之初只是为了网页动态化。2、JAVA大小写敏感,PHP对函数名、方法名、类名是不区分大小写的。这在生产中容易导致问题,比如window系...

推荐文章

热门文章

相关标签