首页 > 编程语言 >[没啥用科技] C++ 分数类

[没啥用科技] C++ 分数类

时间:2024-02-28 22:47:28浏览次数:20  
标签:分数 ma int myr C++ son 科技 operator return

虽然说用的是结构体,但已经实现了同类型加减乘除和分数与整型的加减乘除。

写的有点难看,并伴有大常数,以后来改。

#include <bits/stdc++.h>
#include <bits/extc++.h>
#define ll long long
#define ldb long double
#define m_p(a, b) make_pair(a, b)
using namespace std;
using namespace __gnu_pbds;
int _lcm(int x, int y)
{
	return x / __gcd(x, y) * y;
}
struct myr
{
	int son, ma;
	int vali;
	ldb valr;
	myr()
	{
		son = 0;
		ma = 1;
		vali = 0;
		valr = 0;
	}

	myr operator+(myr B)
	{
		myr A;
		A.ma = _lcm(ma, B.ma);
		son *= (A.ma / ma);
		B.son *= (A.ma / B.ma);
		A.son = son + B.son;
		int smg = __gcd(A.son, A.ma);
		A.son /= smg;
		A.ma /= smg;
		if (A.ma < 0)
		{
			A.son = -A.son;
			A.ma = -A.ma;
		}
		A.vali = A.son / A.ma;
		A.valr = (A.son * 1.0) / (A.ma * 1.0);
		return A;
	}
	myr operator*(myr B)
	{
		myr A;
		int g1 = __gcd(ma, B.son), g2 = __gcd(B.ma, son);
		A.son = son / g2 * B.son / g1;
		A.ma = ma / g1 * B.ma / g2;
		if (A.ma < 0)
		{
			A.son = -A.son;
			A.ma = -A.ma;
		}
		A.vali = A.son / A.ma;
		A.valr = (A.son * 1.0) / (A.ma * 1.0);
		return A;
	}
	myr operator+(int b)
	{
		myr B;
		B.son = b;
		return *this + B;
	}
	myr operator-(int b)
	{
		myr B;
		B.son = -b;
		return *this + B;
	}
	myr operator*(int b)
	{
		myr B;
		B.son = b;
		return *this * B;
	}
	myr operator/(int b)
	{
		myr B;
		B.ma = b;
		return *this * B;
	}
	myr operator/(myr B)
	{
		if (!B.son)
			assert(0);
		swap(B.son, B.ma);
		return *this * B;
	}
	myr operator-(myr B)
	{
		B.son = -B.son;
		return *this + B;
	}
	bool operator==(myr B)
	{
		return son == B.son && ma == B.ma;
	}
	bool operator!=(myr B)
	{
		return !(*this == B);
	}
	bool operator<(myr B)
	{
		return valr < B.valr;
	}
	bool operator>(myr B)
	{
		return valr > B.valr;
	}
	bool operator<=(myr B)
	{
		if (valr < B.valr)
			return 1;
		else
			return *this == B;
	}
	bool operator>=(myr B)
	{
		if (valr > B.valr)
			return 1;
		else
			return *this == B;
	}
};
myr mkr(int x)
{
	myr A;
	A.ma = 1;
	A.son = x;
	A.vali = x;
	A.valr = x;
	return A;
}
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	// freopen(".in","r",stdin);
	// freopen(".out","w",stdout);
	return 0;
}

标签:分数,ma,int,myr,C++,son,科技,operator,return
From: https://www.cnblogs.com/wryyy-233/p/18042189

相关文章

  • c++ primer ch2笔记
    ch22.1基本内置类型C++基本内置类型void算术类型整形(包括字符,bool)浮点型最小尺寸:整形尺寸大小受编译器影响,但是至少会保证一个最小尺寸,int最小尺寸2字节相互关系:int至少和一个short一样大无符号类型:unsignedint、unsignedlong类型转换规则:布......
  • rust与python/c++语法区别
    if/matchpubfnanimal_habitat(animal:&str)->&'staticstr{letid=ifanimal=="crab"{//id等于(或拥有)了一个匿名函数的返回值1}elseifanimal=="gopher"{2}elseifanimal=="snake"......
  • 京津冀三省的2015年度的科技成果数据数据分析
    原始题目要求:一、 数据结构分析:(1)京津冀三省的2015年度的科技成果数据原始表,为Access数据库,; (2)要求将三省的科技成果数据汇总到同一表中(要求结果表为MySql数据表);(3)三个原始数据表结构不一致,要求结果表中包括所有的字段,表达意思相同或相似的字段要进行合并,不允许丢失字段(若只有......
  • C++的异常处理究竟有多慢?
    我们能在各处看到“C++的异常很慢,不要用”这样的言论,不过很少有人告诉你,C++的异常到底有多慢,以及它为什么这么慢。本文会详细介绍C++在抛出以及捕获异常时,代码到底做了什么,以及我们使用C++异常到底付出了多少代价。抛出异常要了解异常处理到底做了什么,我们需要深入到汇编语言来......
  • 通过前向声明解决C++中两个头文件互相引用的问题
    在C++中,当两个头文件互相引用时,可以通过前向声明来避免直接的#include依赖,从而解决循环依赖的问题。前向声明是在一个头文件中声明另一个头文件中的类或类型的名称,而不包括其具体的实现细节。这样,每个头文件只依赖对方的声明,而不需要依赖对方的定义,从而打破了循环依赖。以下是如......
  • OpenCV计数应用 c++(QT)
    一、前言为了挑战一下OpenCV的学习成果,最经一直在找各类项目进行实践。机缘巧合之下,得到了以下的需求:要求从以下图片中找出所有的近似矩形的点并计数,重叠点需要拆分单独计数。二、解题思路1.图片作二值化处理autoimage=cv::imread("points.jpg");cv::Matborder;//为......
  • C++临时对象
    C++临时对象临时对象的构造与析构在C++中,临时对象(TemporaryObject)是在表达式求值过程中创建的、无名字的对象。它们通常用于存储中间结果或作为函数调用的参数或返回值,其生命周期通常仅限于表达式的求值过程中。临时对象的构建和析构与普通对象类似,只是它们的生命周期通常比......
  • 河北稳控科技振弦采集仪在高速公路岩土工程中的监测与评估
    振弦采集仪在高速公路岩土工程中的监测与评估河北稳控科技振弦采集仪是一种常用于结构振动监测的仪器,可以用于高速公路岩土工程中的监测与评估。它的原理是通过测量结构振动引起的振弦的变形来反映结构的振动情况。 在高速公路岩土工程中,振弦采集仪可以用于以下几个方面的监......
  • C++ 点的线性拟合 y(x)=ax+b
    一、简单分析点的线性拟合是一般实验数据处理最常用的方法。下面考虑一个用n个数据点拟合成直线的问题,直线模型为y(x)=ax+b这个问题称为线性回归。设变量y随自变量x变化,给定n组观测数据(xi,yi),用直线来拟合这些点,其中a,b是直线的斜率和截距,称为回归系数。为确定......
  • 微软 官方 .net 组件 下载 directx组件 下载 viual c++ 组件 下载 官方 修复DLL方
    下载.NETFramework|免费官方下载(microsoft.com).NETFramework是仅适用于Windows版本的.NET,用于生成客户端和服务器应用程序。升级应用在VisualStudio中单击几下即可将应用从.NETFramework升级到最新的.NET。  DownloadDirectXEnd-UserRuntimefromO......