【作品】超实用C++分数类
引言
我们说,编程语言的精髓在于封装,而面向对象语言完胜面向过程语言的原因就是具有更好的可封装性,而C++就是这样的一种多范型语言,常用而复杂的工作完全不必在每一份源文件中重敲,就好像我们不需要自己手写printf()和scanf()一样,自建一个属于自己的头文件,可以为编程提供很大的帮助,我今天就要推荐一下我自己原创的分数类(实际上C++STL库有分数类,只是性能很低,而且使用极其不方便,而我的这个分数类具有很多前者不具备的优点,而且颇具工程码风,易于理解与更新)。
注:此为原创文章,转载则务必说明原出处。
Code
将下面的代码存入一个名为fraction.h文件中,并在同目录下的源文件中加上:#include“fraction”即可使用该分数类(使用方法见后面)。
或是在IDE存放头文件的目录下添加一个名为fraction.h的文件,放入该代码并编译,然后便可在该电脑的任何地方创建.cpp文件,并用#include <fraction>包含该文件。
//拱大垲原创
//分数类实现~~~0.8.5
//fraction:分数
//numerator:分子
//denominator:分母
//输入分数时请以回车结尾
//输入部分如含有空格,则空格后面的部分会被忽略
//fraction可缩写为fac,计算机可以识别 #include <iostream>
#include <cmath> #ifndef __fraction_h_
#define __fraction_h_ using namespace std; namespace std
{ //分数类
class fraction
{
public:
static long long MCF(long long a, long long b); friend ostream& operator<< (ostream& os,const fraction& the_fraction);
friend istream& operator>> (istream& is,fraction& the_fraction); friend fraction operator+ (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator- (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator* (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator/ (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator+= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator-= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator*= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator/= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator- (const fraction& the_fraction);
friend fraction operator++ (fraction& the_fraction);
friend fraction operator++ (fraction& the_fraction,int);
friend fraction operator-- (fraction& the_fraction);
friend fraction operator-- (fraction& the_fraction,int); friend bool operator> (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator< (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator>= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator<= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator== (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator!= (fraction& the_fraction_a,const fraction& the_fraction_b); fraction();
fraction(long long the_numerator);
fraction(long long the_numerator,long long the_denominator);
fraction(fraction the_fraction_a,fraction the_fraction_b); double decimal();
long long getnum();
long long getden();
void setnum(long long num);
void setden(long long den); private:
long long numerator;
long long denominator; }; long long fraction::MCF(long long a, long long b)
{
return a==? b:MCF(b%a,a);
} ostream& operator<< (ostream& os,const fraction& the_fraction)
{
bool book=the_fraction.numerator>=&&the_fraction.denominator>=||the_fraction.numerator<&&the_fraction.denominator<;
if(book==false)
os<<"(-";
if(the_fraction.denominator!=)
os<<abs(the_fraction.numerator)<<"/"<<abs(the_fraction.denominator);
else
os<<abs(the_fraction.numerator);
if(book==false)
os<<")";
return os;
} istream& operator>> (istream& is,fraction& the_fraction)
{
char input[];
char ch;
bool mid=false;
bool is_pt=true;
the_fraction.numerator=the_fraction.denominator=;
cin>>input;
for(int i=;;i++)
{
ch=input[i];
if(ch=='\0')
break;
if(ch=='-')
{
is_pt=!is_pt;
continue;
}
if(ch=='/')
{
mid=true;
continue;
}
if(mid==false)
the_fraction.numerator=the_fraction.numerator*+(ch-'');
else
the_fraction.denominator=the_fraction.denominator*+(ch-'');
}
if(mid==false)
the_fraction.denominator=;
if(the_fraction.denominator==)
{
cout<<"False,the denominator == 0!!!";
return is;
}
long long mcf=fraction::MCF(the_fraction.numerator,the_fraction.denominator);
the_fraction.numerator/=mcf;
the_fraction.denominator/=mcf;
if(!is_pt)
the_fraction.numerator=-the_fraction.numerator;
return is;
} fraction operator+ (const fraction& the_fraction_a,const fraction& the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.denominator+the_fraction_b.numerator*the_fraction_a.denominator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.denominator;
return fraction(the_numerator,the_denominator);
} fraction operator- (const fraction& the_fraction_a,const fraction& the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.denominator-the_fraction_b.numerator*the_fraction_a.denominator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.denominator;
return fraction(the_numerator,the_denominator);
}
fraction operator* (const fraction& the_fraction_a,const fraction& the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.numerator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.denominator;
long long mcf=fraction::MCF(the_numerator,the_denominator);
the_numerator/=mcf;
the_denominator/=mcf;
fraction the_fraction(the_numerator,the_denominator);
return the_fraction;
} fraction operator/(const fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a*fraction(the_fraction_b.denominator,the_fraction_b.numerator);
} fraction operator+= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a+the_fraction_b;
} fraction operator-= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a-the_fraction_b;
} fraction operator*= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a*the_fraction_b;
} fraction operator/= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a=the_fraction_a/the_fraction_b;
} fraction operator- (const fraction& the_fraction)
{
return -the_fraction;
} fraction operator++ (fraction& the_fraction)
{
the_fraction=the_fraction+;
return the_fraction;
}
fraction operator++ (fraction& the_fraction,int)
{
the_fraction=the_fraction+;
return the_fraction-;
}
fraction operator-- (fraction& the_fraction)
{
the_fraction=the_fraction-;
return the_fraction;
}
fraction operator-- (fraction& the_fraction,int)
{
the_fraction=the_fraction-;
return the_fraction+;
} bool operator> (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator>the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator< (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator<the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator>= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator>=the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator<= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator<=the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator== (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator==the_fraction_b.numerator*the_fraction_a.denominator;
}
bool operator!= (fraction& the_fraction_a,const fraction& the_fraction_b)
{
return the_fraction_a.numerator*the_fraction_b.denominator!=the_fraction_b.numerator*the_fraction_a.denominator;
} fraction::fraction()
{
numerator=;
denominator=;
} fraction::fraction(long long the_numerator)
{
numerator=the_numerator;
denominator=;
} fraction::fraction(long long the_numerator,long long the_denominator)
{
long long mcf=fraction::MCF(the_numerator,the_denominator);
numerator=the_numerator/mcf;
denominator=the_denominator/mcf;
} fraction::fraction(fraction the_fraction_a,fraction the_fraction_b)
{
long long the_numerator=the_fraction_a.numerator*the_fraction_b.denominator;
long long the_denominator=the_fraction_a.denominator*the_fraction_b.numerator;
long long mcf=fraction::MCF(the_numerator,the_denominator);
numerator=the_numerator/mcf;
denominator=the_denominator/mcf;
} double fraction::decimal()
{
return 1.0*numerator/denominator;
} long long fraction::getnum()
{
return numerator;
}
long long fraction::getden()
{
return denominator;
}
void fraction::setnum(long long num)
{
numerator=num;
long long mcf=fraction::MCF(numerator,denominator);
numerator/=mcf;
denominator/=mcf;
}
void fraction::setden(long long den)
{
if(den!=)
{
denominator=den;
long long mcf=fraction::MCF(numerator,denominator);
numerator/=mcf;
denominator/=mcf;
}
else
{
cout<<"False,the denominator == 0!!!";
}
} typedef fraction fac; } #endif
使用方法
目录
- 简介
- 一目运算符重载
- 二目运算符重载
- 构造函数
- 成员函数
- 数据成员
- 注意事项
简介
一个重载了几乎所有运算符的分数类。
一目运算符重载
friend fraction operator- (const fraction& the_fraction);
friend fraction operator++ (fraction& the_fraction);
friend fraction operator++ (fraction& the_fraction,int);
friend fraction operator-- (fraction& the_fraction);
friend fraction operator-- (fraction& the_fraction,int);
这些友元函数重载了前置与后置的自增自减运算符,以及取负运算符,如a是一个分数,-a表示a的相反数,a++/a--表示后置递增/递减,++a/--a表示前置递增/递减。
二目运算符重载
friend ostream& operator<< (ostream& os,const fraction& the_fraction);
friend istream& operator>> (istream& is,fraction& the_fraction);
该函数重载了输入输出运算符,使之可以用于cin/cout对象,如a是分数类对象,其值等于-4/3,cout<<a,将在屏幕上显示(-4/3),cin>>a将读取一个整数加一个分数线再加一个整数,如42/43,输入完毕后以回车结尾,不可以以空格结尾,可以任意一个整数前加负号已输入分数(若输入-4/-3,则系统会按整数存储,即4/3)。
friend fraction operator+ (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator- (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator* (const fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator/ (const fraction& the_fraction_a,const fraction& the_fraction_b);
这四个运算符重载了+-*/四则运算,使之可以用于分数(计算结果若非最简分数,系统会自动约分)。
friend fraction operator+= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator-= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator*= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend fraction operator/= (fraction& the_fraction_a,const fraction& the_fraction_b);
这四个函数重载了+=,-=,*=,/=复合运算符,使之可以用于分数,将返回其右面的表达式的值。
friend bool operator> (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator< (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator>= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator<= (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator== (fraction& the_fraction_a,const fraction& the_fraction_b);
friend bool operator!= (fraction& the_fraction_a,const fraction& the_fraction_b);
该6个函数重载了关系运算符,使之可以用于分数。
构造函数
fraction();
此为默认构造函数,将分数初始化为0/1。
fraction(long long the_numerator);
此为转换构造函数,可以将一个long long类型的数据转换为分数,同时也可以显示调用,如:fraction a(10);将创建一个值为10/1的分数。
fraction(long long the_numerator,long long the_denominator);
fraction(fraction the_fraction_a,fraction the_fraction_b);
此为最主要的构造函数,将两个参数的商作为分数的值。
如:fraction a(150,100)将创建一个值为3/2的分数。
如:fraction a(fraction(2,3),fraction(3,2))将创建一个值为1/1的分数。
成员函数
double decimal();
返回分子除以分母的double型值。
long long getnum();
返回分子的值。
long long getden();
返回分母的值。
void setnum(long long num);
接受一个参数,并将其赋给分子(自动约分)。
void setden(long long den);
接受一个非0参数,并将其赋给分母(自动约分)(若参数为0,则不会赋给分母,并在标准输出流中输出错误信息:"False,the denominator == 0!!!")。
数据成员
分子:long long numerator;
分母:long long denominator;
静态成员函数
static long long MCF(long long a, long long b);
此函数接受两个long long型参数,并返回一个值等于他们的最大公因数的long long型值。如fraction::MCF(2,4)的值为2。
注意事项
使用fraction时的一切有关代码中的fraction都可以简写为fac,二者完全等价。
分数类的头文件与使用它的源代码文件保存在同一目录下时,必须先编译一下头文件,然后再编译源代码文件,否则会有编译错误,编译后的头文件如果被更改或转移到另一目录下后也必须重新编译,否则会有编译错误!!!
后记
此为原创文章,未经允许,严禁转载!!!(在评论区或私信中跟我声明后可以转载,但必须说明出处)
【作品】超实用C++分数类的更多相关文章
- 连分数(分数类模板) uva6875
//连分数(分数类模板) uva6875 // 题意:告诉你连分数的定义.求连分数,并逆向表示出来 // 思路:直接上分数类模板.要注意ai可以小于0 #include <iostream> ...
- OC2_分数类
// // Fraction.h // OC2_分数类 // // Created by zhangxueming on 15/6/10. // Copyright (c) 2015年 zhangxu ...
- 第十七周oj刷题——Problem B: 分数类的四则运算【C++】
Description 编写分数类Fraction,实现两个分数的加.减.乘和除四则运算.主函数已给定. Input 每行四个数,分别表示两个分数的分子和分母,以0 0 0 0 表示结束. Outpu ...
- Problem F: 分数类的类型转换
Description 封装一个分数类Fract,用来处理分数功能和运算,支持以下操作: 1. 构造:传入两个参数n和m,表示n/m:分数在构造时立即转化成最简分数. 2. show()函数:分数 ...
- Problem E: 分数类的输出
Problem E: 分数类的输出 Time Limit: 3 Sec Memory Limit: 128 MBSubmit: 2699 Solved: 1227[Submit][Status][ ...
- java的分数类
概述 分数类在算法中非常重要, 而在java中不那么重要,java基础类库提供 了biginteger了,提供类似方式, package 组合数学; public class Fraction { p ...
- UVA 10288 Coupons---概率 && 分数类模板
题目链接: https://cn.vjudge.net/problem/UVA-10288 题目大意: 一种刮刮卡一共有n种图案,每张可刮出一个图案,收集n种就有奖,问平均情况下买多少张才能中奖?用最 ...
- 【Java例题】2.2 分数类
2.定义分数类,包括分子和分母变量.构造方法. 加减乘除方法.化简方法.值计算方法和显示分子和分母的方法. 然后编写一个主类,在其主方法中通过定义两个分数对象来 显示每一个分数的分子值.分母值.化简和 ...
- hdu 6206 : Apple 【计算几何 + 分数类】
题目链接 比赛时C++上__float128都被卡精度,然后扔给队友用Java的BigDecimal过了 算法不多说,求三角形外心可以参考 维基百科 https://zh.wikipedia.org/ ...
随机推荐
- 借助URLOS快速安装Discuz论坛
### 简介 Discuz!是个可免费下载的PHP网络论坛程序,简称DZ,由戴志康所创立,当前最新版本是Discuz! X3.4.前身为Crossday Bulletin,最初改自XMBForum,尔 ...
- c++ 逆序对
c++ 求逆序对 例如数组(3,1,4,5,2)的逆序对有(3,1)(3,2)(4,2)(5,2)共4个 逆序对就是左边的元素比右边的大,那么左边的元素和右边的元素就能产生逆序对 代码跟归并排序差不多 ...
- springboot2.x纯注解整合dubbo
springboot1.x和springboot2.x整合差距挺大的,基于最新的2.x进行整合,使用纯注解的方式 依赖选取 首先pom文件的依赖引入,maven仓库有Apache和alibaba两个 ...
- NOIP2015斗地主题解 7.30考试
问题 B: NOIP2015 斗地主 时间限制: 3 Sec 内存限制: 1024 MB 题目描述 牛牛最近迷上了一种叫斗地主的扑克游戏.斗地主是一种使用黑桃.红心.梅花.方片的A到K加上大小王的共 ...
- Spring中@value以及属性注入的学习
1.简单的Java配置 配置文件(jdbc.properties) jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://1 ...
- ASP.NET Core MVC 之模型(Model)
1.模型绑定 ASP.NET Core MVC 中的模型绑定将数据从HTTP请求映射到操作方法参数.参数既可以是简单类型,也可以是复杂类型.MVC 通过抽象绑定解决了这个问题. 2.使用模型绑定 当 ...
- 从0系统学Android--1.3创建你的第一个 Android 项目
1.3 创建你的第一个 Android 项目 环境搭建完成后,我们就可以写下我们的第一个项目了. 1.3.1 创建 HelloWorld 项目 在 Android Studio 的欢迎页面点击 Sta ...
- [leetcode] 300. Longest Increasing Subsequence (Medium)
题意: 求最长增长的子序列的长度. 思路: 利用DP存取以i作为最大点的子序列长度. Runtime: 20 ms, faster than 35.21% of C++ online submissi ...
- fjnuoj 1003 学长的QQ号
题目: //QQ是一个9位数,由1,2,3,4,5,9组成,且第1.6位数字相同,第2.4位数字相同,第5.7位数字相同. //我的QQ就在符合上诉条件中的所有9位数从小到大排第 ...
- [LeetCode] 32. Longest Valid Parentheses (hard)
原题链接 题意: 寻找配对的(),并且返回最长可成功配对长度. 思路 配对的()必须是连续的,比如()((),最长长度为2:()(),最长长度为4. 解法一 dp: 利用dp记录以s[i]为终点时,最 ...