C++ 有理数类
时间:2020-05-29
本文章向大家介绍C++ 有理数类,主要包括C++ 有理数类使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
C++只提供了整数类和浮点数类,但是没有有理数类,所以需要自己写一个有理数类。
我们将使用分数来表示一个有理数。即Rational类有两个数据域,分子叫做 numerator,分母叫做denominator,且分母不能为0。
同时,一个有理数可能又很多表现形式,比如1/3可以表示为2/6,3/9等,我们统一用化简后的形式表示这个数,比如1/3。
Rational.h
#ifndef RATIONAL_H #define RATIONAL_H #include <string> using namespace std; class Rational{ public: //无参构造函数 Rational(); //有参构造函数,两个参数分别是分子和分母 Rational(int numerator, int denominator); //获取分子 int getNumerator() const; //获取分母 int getDenominator() const; //两数求和,返回Rational类对象 Rational add(const Rational& secondRational) const; //两数求差,返回Rational类对象 Rational subtract(const Rational& secondRational) const; //两数相乘,返回Rational类对象 Rational multiply(const Rational& secondRational) const; //两数相除,返回Rational类对象 Rational divide(const Rational& secondRational) const; //比较两个有理数 int compareTo(const Rational& secondRational) const; //若两个有理数相等,则返回true;否则,返回false bool equals(const Rational& secondRational) const; //返回一个整型数 int intValue() const; //返回一个浮点数 double doubleValue() const; //返回一个字符串 string toString() const; private: //分子 int numerator; //分母 int denominator; //求公因数,用于约分 static int gcd(int n, int d); }; #endif // RATIONAL_H
Rational.cpp
#include "Rational.h" #include <sstream> #include <cstdlib> Rational::Rational() { //构造一个值为0的对象 this->numerator = 0; this->denominator = 1; } Rational::Rational(int numerator, int denominator) { int temp = gcd(numerator, denominator); this->numerator = ((denominator > 0) ? 1 : -1) * numerator / temp; this->denominator = abs(denominator) / temp; } int Rational::getNumerator() const { return this->numerator; } int Rational::getDenominator() const{ return this->denominator; } int Rational::gcd(int n, int d) { int n1 = abs(n); int n2 = abs(d); int gcd = 1; for (int i = 1; i <= n1 && i <= n2; i ++) { if (n1 % i == 0 && n2 % i == 0) { gcd = i; } } return gcd; } Rational Rational::add(const Rational& secondRational) const { int n = numerator * secondRational.getDenominator() + denominator * secondRational.getNumerator(); int d = denominator * secondRational.getDenominator(); return Rational(n, d); } Rational Rational::subtract(const Rational& secondRational) const { int n = numerator * secondRational.getDenominator() - denominator * secondRational.getNumerator(); int d = denominator * secondRational.getDenominator(); return Rational(n, d); } Rational Rational::multiply(const Rational& secondRational) const { int n = numerator * secondRational.getNumerator(); int d = denominator * secondRational.getDenominator(); return Rational(n, d); } Rational Rational::divide(const Rational& secondRational) const { int n = numerator * secondRational.getDenominator(); int d = denominator * secondRational.getNumerator(); return Rational(n, d); } int Rational::compareTo(const Rational& secondRational) const { //作差法比较大小 Rational temp = subtract(secondRational); if (temp.getNumerator() < 0) { //小于 return -1; } else if (temp.getNumerator() == 0) { //等于 return 0; } else { //大于 return 1; } } bool Rational::equals(const Rational& secondRational) const { if(compareTo(secondRational) == 0) { return true; } else { return false; } } int Rational::intValue() const { return getNumerator()/getDenominator(); } double Rational::doubleValue() const { return 1.0 * getNumerator()/getDenominator(); } string Rational::toString() const { stringstream ss; ss << numerator; if(denominator > 1) { ss << "/" <<denominator; } return ss.str(); }
main.cpp
#include <iostream> #include "Rational.h" using namespace std; int main() { Rational r1(4, 2); Rational r2(2, 3); cout << "r1的值为" << r1.toString() << endl << "r2的值为" << r2.toString() << endl; cout << "-------------------------------" << endl; cout << r1.toString() << " + " << r2.toString() << " = " << r1.add(r2).toString() << endl; cout << r1.toString() << " - " << r2.toString() << " = " << r1.subtract(r2).toString() << endl; cout << r1.toString() << " * " << r2.toString() << " = " << r1.multiply(r2).toString() << endl; cout << r1.toString() << " / " << r2.toString() << " = " << r1.divide(r2).toString() << endl; cout << "-------------------------------" << endl; cout << "r2向下取整:" << r2.intValue() << endl; cout << "r2转换为小数:" << r2.doubleValue() << endl; cout << "-------------------------------" << endl; cout << "r1.compareTo(r2)的返回值是:" << r1.compareTo(r2) << endl; cout << "r2.compareTo(r1)的返回值是:" << r2.compareTo(r1) << endl; cout << "r1.compareTo(r1)的返回值是:" << r1.compareTo(r1) << endl; cout << "-------------------------------" << endl; cout << "r1.equals(r1)的返回值是:" << r1.equals(r1) << endl; cout << "r1.equals(r2)的返回值是:" << r1.equals(r2) << endl; cout << "-------------------------------" << endl; return 0; }
运行结果:
原文地址:https://www.cnblogs.com/bwjblogs/p/12982908.html
- 如何正确的猜拳:反事实遗憾最小化算法
- 使用python中的Numpy进行t检验
- 实操 Web Cache
- 怎样制作RPM包
- 框架设计原则和规范(完)
- 这或许是对小白最友好的python入门了吧——9,数字深入体验
- WebAPI返回数据类型解惑 以及怎样解决Extjs无法解析返回的xml
- 图像处理:利用神经网络生成新图像和修复旧图像
- 这或许是对小白最友好的python入门了吧——8,初识for语句
- Extjs 项目中常用的小技巧,也许你用得着(3)
- 对于Ext.data.Store 介紹 与总结,以及对以前代码的重构与优化
- 数据库与图片完美解决方案
- 数据库进程间通信解决方案
- 【实践操作】在iPhone上创建你的第一个机器学习模型
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- arm(3)| 点亮led灯
- 根据 PID 获取容器所在的 Pod 名称
- Python 爬虫进阶必备 | 关于某服务平台数据解密流程分析
- batch-compute & GPU分布式机器学习
- 数据源管理 | 搜索引擎框架,ElasticSearch集群模式
- PHP的CLI命令行运行模式浅析
- 基于Pytorch构建三值化网络TWN
- 从零学Paddle系列-1 Paddle框架CNN相关API详解
- 智能搜索模型预估框架的建设与实践
- 1,Jupyter NoteBook 常用魔法命令
- 60行代码徒手实现深度神经网络
- 30行代码徒手实现logistic回归
- 8,模型的训练
- 在腾讯云上部署科学计算软件Amber
- 手把手教你搭建一个灰度发布环境