浅谈C++有理数的表达和计算

 更新时间:2021年11月02日 11:56:52   作者:mou某谋  
这篇文章主要为大家详细介绍了C++有理数的表达和计算,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
#ifndef Rational_hpp
#define Rational_hpp
#include <stdio.h>
#include <string>
using namespace std;
class Radtional{
public:
    Radtional();
    Radtional(int numerator,int denominator);
    int getNumerator()const;
    int getDemominator()const;
    Radtional add(const Radtional& secondRational);
    Radtional sub(const Radtional& secondRational);
    Radtional mult(const Radtional& secondRational);
    Radtional div(const Radtional& secondRational);
    int compareTo(const Radtional& secondRational);
    bool equals(const Radtional& secondRational);
    int intValue();
    double doubleValue();
    string toString();
private:
    int numerator,denominator;
    static int gcd(int n,int d);
};
#endif /* Rational_hpp */
#include "Rational.hpp"
#include <sstream>
#include <cstdlib>
Radtional::Radtional(){
    numerator = 0;
    denominator = 1;
}
Radtional::Radtional(int numerator,int denominator)
{
    int factor = gcd(numerator, denominator);
    this->numerator = ((numerator>0) ? 1: -1)*abs(numerator)/factor;
    this->denominator = abs(denominator)/factor;
}
int Radtional::getNumerator()const{
    return numerator;
}
int Radtional::getDemominator()const{
    return denominator;
}
int Radtional::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;
}
Radtional Radtional::add(const Radtional& secondRational){
    int n = numerator*secondRational.getDemominator()+denominator*secondRational.getNumerator();
    int d = denominator * secondRational.getDemominator();
    return Radtional(n,d);
}
Radtional Radtional::sub(const Radtional &secondRational){
    int n = numerator * secondRational.getDemominator() - denominator* secondRational.getNumerator();
    int d = denominator * secondRational.getDemominator();
    return Radtional(n,d);
}
Radtional Radtional::mult(const Radtional &secondRational){
    int n = numerator * secondRational.getNumerator();
    int d = denominator * secondRational.getDemominator();
    return Radtional(n,d);
}
Radtional Radtional::div(const Radtional &secondRational){
    int n =numerator * secondRational.getDemominator();
    int d =denominator * secondRational.getNumerator();
    return Radtional(n,d);
}
int Radtional::compareTo(const Radtional &secondRational){
    Radtional temp =sub(secondRational);//两值相减
    if (temp.getNumerator()<0) {
        return -1;
    }
    else if (temp.getNumerator()==0){
        return 0;
    }
    else
        return 1;
}
bool Radtional::equals(const Radtional &secondRational){
    if (compareTo(secondRational)==0) {
        return true;
    }
    else
        return false;
}
int Radtional::intValue(){
    return getNumerator()/getDemominator();
}
double Radtional::doubleValue(){
    return 1.0*getNumerator()/getDemominator();
}
string Radtional::toString(){
    stringstream ss;
    ss<<numerator;
    if (denominator>1) {
        ss<<"/"<<denominator;
    }
    return ss.str();
}

简单测试

#include <iostream>
#include "Rational.hpp"
int main(int argc, const char * argv[]) {
    // insert code here...
    Radtional a(3,2);
    Radtional b(2,5);
    Radtional c(1,3);
    Radtional d(2,6);
    cout<<a.toString()<<" + "<<b.toString()<<"="<<(a.add(b)).toString()<<endl;
    cout<<a.toString()<<" - "<<b.toString()<<"="<<(a.sub(b)).toString()<<endl;
    cout<<a.toString()<<" * "<<b.toString()<<"="<<(a.mult(b)).toString()<<endl;
    cout<<a.toString()<<" / "<<b.toString()<<"="<<(a.div(b)).toString()<<endl;
    cout<<c.toString()<<" - "<<a.toString()<<"="<<(c.sub(a)).toString()<<endl;
    cout<<c.toString()<<"的int转换为"<<c.intValue()<<endl;
    cout<<c.toString()<<"的double转换为"<<c.doubleValue()<<endl;
    cout<<c.toString()<<"和"<<a.toString()<<"比较结果"<<c.compareTo(a)<<endl;
    cout<<c.toString()<<"和"<<d.toString()<<"比较结果"<<c.compareTo(d)<<endl;
    cout<<b.toString()<<"和"<<a.toString()<<"比较结果"<<b.compareTo(a)<<endl;
    return 0;
}

测试结果

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注脚本之家的更多内容!

相关文章

  • C语言中的浮点数存储详解

    C语言中的浮点数存储详解

    这篇文章主要介绍了C语言中的浮点数存储详解,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2025-03-03
  • C语言对数组元素进行冒泡排序的实现

    C语言对数组元素进行冒泡排序的实现

    这篇文章主要介绍了C语言对数组元素进行冒泡排序的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • C语言多组输入使用方法

    C语言多组输入使用方法

    这篇文章主要给大家介绍了关于C语言多组输入使用的相关资料,在 C语言中可以使用循环语句来实现多组输入,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2023-07-07
  • 基于C语言实现http下载器

    基于C语言实现http下载器

    做OTA升级功能时,我们能直接拿到的往往只是升级包的链接,需要我们自己去下载,这时候就需要用到http下载器。本文将利用C语言实现简单的http下载器,感兴趣的可以了解一下
    2022-12-12
  • C++ invoke与function的区别解析

    C++ invoke与function的区别解析

    invoke函数的实现原理是通过使用SFINAE(Substitution Failure Is Not An Error)技术来判断可调用对象的类型,并根据类型调用对应的调用方式,这篇文章主要介绍了C++ invoke与function的区别,需要的朋友可以参考下
    2023-10-10
  • opencv学习笔记C++绘制灰度直方图

    opencv学习笔记C++绘制灰度直方图

    这篇文章主要为大家介绍了opencv学习笔记C++绘制灰度直方图的实现代码,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • MFC自定义消息的实现方法

    MFC自定义消息的实现方法

    这篇文章主要介绍了MFC自定义消息的实现方法,通过该示例可以更好的理解MFC的消息封装机制,以便更加灵活的打造个性化的windows应用程序,需要的朋友可以参考下
    2014-07-07
  • C++中的封装、继承、多态理解

    C++中的封装、继承、多态理解

    这篇文章主要介绍了C++中的封装、继承、多态介绍,需要的朋友可以参考下
    2020-01-01
  • C语言内存对齐实例详解

    C语言内存对齐实例详解

    这篇文章主要介绍了C语言内存对齐,包括内存对其的基本概念及用法,以及注意事项,并以实例形式加以说明,需要的朋友可以参考下
    2014-09-09
  • C++ 遍历目录下文件简单实现实例

    C++ 遍历目录下文件简单实现实例

    这篇文章主要介绍了c++ 遍历文件的相关资料,这里附有实现实例代码,需要的朋友可以参考下
    2017-02-02

最新评论