自定义大整数类(初次版本)

news2024/11/19 17:45:16

例子:

#include "X:\Work\Share\CCode\CPlatform\MathExt\_MathExt_out.h"
 
using namespace lf;
using namespace std;
 
 

int main()
{
    
    _Integer i1 = _t("12345678989764581381214575686787987979234234354364");

        
    _Integer  i2 = _t("1234567898976458138121");

    _pcn(i1 / i2);


    _Integer i3 = 6, i4 = -9, i5 = 234;

    _pcn(i3);

    if (i3 > i4)
    {
        std::cout << "i3 > i4" << "\n";
    }
    if (i3 > i5)
    {
        std::cout << "i3 > i5" << "\n";
      
    }

 
    for (_Integer i = 0; i < 10; i++)
    {
        _pcn(i);
    }

  

    for (_Integer i = 10; i > 0;  --i)
    {
        _pcn(i);
    }
 
   return 0;
     
}

运行结果:

_Integer.h

/*******************************************************************************************
文件名			: _Integer.h

作者				: 李锋

手机				: 13828778863

Email			: ruizhilf@139.com

功能				: 可以表示无限整数的类

创建时间			: 2024-04-15

最后一次修改时间	:  2024-04-28


********************************************************************************************/ 
#pragma once

#include "_MathExt_in.h"

_LF_BEGIN_


/// <summary>
/// 用链接表示的十进制数整数
/// </summary>
/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
class _Integer : public _Object
{
private:
	/// <summary>
	/// 表示当前数字字符串
	/// </summary>
	_string _num;

	/// <summary>
	/// 是否为负数
	/// </summary>
	bool  _IsNegative;

	void _InitData();

public:

 

	/// <summary>
	/// 【中文】:充许的书写格式
	/// 【英文】:Allowed writing format
	/// 001 不可以
	/// -1  不可以
	/// +5  不可以
	/// 3a  不可以
	/// 318,000 不可以
	/// </summary>
	/// <param name="sNum"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-26    最后一次修改时间:2024-04-26   
	static bool IsAllowedWritingFormat(const _string& sNum);


	static void Check(const _string& sNum);


	/// <summary>
	/// 无符号的两个整数相加 (参考自星飞星火)
	/// </summary>
	/// <param name="num1"></param>
	/// <param name="num2"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-21    最后一次修改时间:2024-04-21   
	static _string Add(const _string& num1, const _string& num2);


	/// <summary>
	/// 无符号的两个整数相减,部分算法参考自星飞星火,但星火
	/// 算的结果只有同位数相减才正确,注意:这里是假定是无符
	/// 号两个整数相减。
	/// 【中文】:两个数相减
	/// 【英文】:Subtract two numbers
	/// 百度文心一言和星飞星火结果不对。
	/// </summary>
	/// <param name="num1"></param>
	/// <param name="num2"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-21    最后一次修改时间:2024-04-25 (已测试)
	static _string Subtract(const _string& num1, const _string& num2, bool isCheckForamt = true);

	/// <summary>
	/// 无符号的两个整数相减(使用标准库)
	/// </summary>
	/// <param name="num1"></param>
	/// <param name="num2"></param>
	/// <returns></returns>
	static std::string Subtract_std(const std::string& num1, const std::string& num2);

	/// <summary>
	/// 无符号的两个整数相剩 (参考自星飞星火)
	/// 【中文】:两个数相乘
	/// 【英文】:Multiplication of two numbers
	/// </summary>
	/// <param name="sNum1"></param>
	/// <param name="sNum2"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-21    最后一次修改时间:2024-04-21  (已测试)
	static _string Multiplication(const _string& sNum1, const _string& sNum2, bool isCheckForamt = true);



	/// <summary>
	/// sNum1 / sNum2 ,sNum1 的倍数受制于int所能表达的最大值
	/// </summary>
	/// <param name="sNum1"></param>
	/// <param name="sNum2"></param>
	/// <param name="isCheckForamt"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-26    最后一次修改时间:2024-04-27  (已测试)
	static _Pair<int, _string> SmallDiv(const _string& sNum1, const _string& sNum2, bool isCheckForamt = true);


	/// <summary>
	/// 【单词中英文对照】:两个数相除 - Divide two numbers
	/// 
	/// 百度文心一言和星飞星火结果不对。
	/// </summary>
	/// 创建时间:2024-04-25    最后一次修改时间:2024-04-26   (已测式,这个函数用了大约1整天时间,搞死人)
	static _string Divide(const _string& sNum1, const _string& sNum2, bool isCheckForamt = true);

  
public://-----------------------------构造

	_Integer();
	_Integer(const _Integer& integer);
	_Integer(const int& iValue);
	_Integer(const _string& sNum);


	/// <summary>
	/// 
	/// </summary>
	/// <param name="pStr"></param>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	_Integer(const _char*  pStr);
public:



public: //----------------------------运算符重载


	/// <summary>
	/// 
	/// </summary>
	/// <param name="iVlue"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	bool  operator==(const int& iVlue);

 
	/// <summary>
	/// 
	/// </summary>
	/// <param name="right"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	_Integer operator*(const _Integer& r)const;


	/// <summary>
	/// 
	/// </summary>
	/// <param name="right"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	_Integer operator/(const _Integer& r)const;

	/// <summary>
	/// 
	/// </summary>
	/// <param name="right"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	_Integer operator+(const _Integer& r)const;

	/// <summary>
	/// 
	/// </summary>
	/// <param name="right"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	_Integer operator-(const _Integer& r)const;


	/// <summary>
	/// 前置加加
	/// </summary>
	/// <returns></returns>
	/// 创建时间:2024-04-28    最后一次修改时间:2024-04-28
	_Integer& operator++();


	/// <summary>
	/// 
	/// </summary>
	/// <returns></returns>
	/// 创建时间:2024-04-28    最后一次修改时间:2024-04-28
	_Integer& operator--();


	/// <summary>
	/// 后置加加
	/// </summary>
	/// <param name=""></param>
	/// <returns></returns>
	/// 创建时间:2024-04-28    最后一次修改时间:2024-04-28
	_Integer operator++(int);


	/// <summary>
	/// 
	/// </summary>
	/// <param name=""></param>
	/// <returns></returns>
	/// 创建时间:2024-04-28    最后一次修改时间:2024-04-28
	_Integer operator--(int);


	/// <summary>
	/// 表达式:前缀负号 (- obj)
	/// </summary>
	/// <returns></returns>
	/// 创建时间:2024-04-15    最后一次修改时间:2024-04-15
	_Integer operator-() const;

	/// <summary>
	/// 	
	/// </summary>
	/// <param name="l"></param>
	/// <param name="r"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-19    最后一次修改时间:2024-04-28
	friend bool operator>(const _Integer& l, const _Integer& r);

	/// <summary>
	/// 
	/// </summary>
	/// <param name="l"></param>
	/// <param name="r"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-19    最后一次修改时间:2024-04-19
	friend bool operator < (const _Integer& l, const _Integer& r);




	/// <summary>
	/// 
	/// </summary>
	/// <param name="l"></param>
	/// <param name="r"></param>
	/// <returns></returns>
	/// 创建时间:2024-04-19    最后一次修改时间:2024-04-19
	friend bool operator== (const _Integer& l, const _Integer& r);

	friend bool operator!= (const _Integer& l, const _Integer& r);

public: //----------------------------功能函数
 

	virtual _string ToSplitString(const _string& splitString) const override;
public:
  
};


_LF_END_

_Integer.cpp

#include"_Integer.h"

_LF_BEGIN_



void _Integer::_InitData()
{
	_IsNegative = false;
}

bool _Integer::IsAllowedWritingFormat(const _string& sNum)
{

	/// 001 不可以
	/// -1  不可以
	/// +5  不可以
	/// 3a  不可以
	/// 318,000 不可以

	if (!sNum.IsAllArabicDigitString())
		return false;

	//001
	if (sNum[0] == _t('0') && sNum.Length > 1) //排除0
		return false;

	return true;
}

void _Integer::Check(const _string& sNum)
{
	if (sNum.Length == 0)
	{
		_string sErrorText = _t("sNum.Length == 0 传递空字符串。\n");

		ga.Print(sErrorText);
		assert(false);
	}
	if (!IsAllowedWritingFormat(sNum))
	{
		_string sErrorText = _t(" “") + sNum + _t("” 不是正确的书写格式!\n");
		ga.Print(sErrorText);
		assert(false);
	}
}



/// <summary>
/// 无符号的两个整数相加 (参考自星飞星火)
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
/// 创建时间:2024-04-21    最后一次修改时间:2024-04-28 
_string _Integer::Add(const _string& num1, const _string& num2)
{
	/*
	std::string add(const std::string &num1, const std::string &num2) {
		int len1 = num1.size();
		int len2 = num2.size();
		int maxLen = std::max(len1, len2);
		std::string result(maxLen + 1, '0');

		int carry = 0;
		for (int i = 0; i < maxLen; i++) {
			int sum = carry;
			if (i < len1) {
				sum += num1[len1 - 1 - i] - '0';
			}
			if (i < len2) {
				sum += num2[len2 - 1 - i] - '0';
			}
			carry = sum / 10;
			sum %= 10;
			result[maxLen - i] = sum + '0';
		}
		if (carry > 0) {
			result[0] = carry + '0';
		} else {
			result.erase(result.begin());
		}

		return result;
	}
	*/
	 
	 
	int len1 = num1.std_size();
	int len2 = num2.std_size();
	int maxLen = _Math::Max(len1, len2);
	_string result(maxLen + 1, _t('0'));

	int carry = 0;
	for (int i = 0; i < maxLen; i++) {
		int sum = carry;
		if (i < len1) {
			sum += num1[len1 - 1 - i] - _t('0');
		}
		if (i < len2) {
			sum += num2[len2 - 1 - i] - _t('0');
		}
		carry = sum / 10;
		sum %= 10;
		result[maxLen - i] = sum + _t('0');
	}
	if (carry > 0) {
		result[0] = carry + _t('0');
	}
	else {
		//result.std_erase(result.std_begin());	 
		return result.SubStr(1, result.Length - 1);
	}

	return result;
}


/// <summary>
/// 无符号的两个整数相减,部分算法参考自星飞星火,但星火
/// 算的结果只有同位数相减才正确,注意:这里是假定是无符
/// 号两个整数相减。
/// 【中文】:两个数相减
/// 【英文】:Subtract two numbers
/// 百度文心一言和星飞星火结果不对。
/// </summary>
/// <param name="num1"></param>
/// <param name="num2"></param>
/// <returns></returns>
/// 创建时间:2024-04-21    最后一次修改时间:2024-04-25 (已测试)
_string _Integer::Subtract(const _string& num1, const _string& num2, bool isCheckForamt)
{
	if (isCheckForamt){	Check(num1);	Check(num2);}
	/*
	*   星火给出的代码:
	* 
		int len1 = num1.size();
		int len2 = num2.size();
		int maxLen = std::max(len1, len2);
		std::string result(maxLen, '0');

		int iBorrow = 0;
		for (int i = 0; i < maxLen; i++) {
			int iDiff = num1[len1 - 1 - i] - num2[len2 - 1 - i] - iBorrow;
			if (iDiff < 0) {
				iDiff += 10;
				iBorrow = 1;
			}
			else {
				iBorrow = 0;
			}
			result[maxLen - 1 - i] = iDiff + '0';
		}

		result.erase(std::find_if(result.rbegin(), result.rend(), [](char ch) { return ch != '0'; }).base(), result.end());

		return result;
	*/
	  
	int len1 = num1.Length;
	int len2 = num2.Length;

	int maxLen = _Math::Max(len1, len2);
	  
	_string sResult(_t(""), maxLen + 1);

	//这里先比较字符串长度(数字位数)的大小
	if (len1 > len2){	 //num1 > num2
		int iBorrow = 0;
		for (int i = 0; i < len2; i++) {
			int iDiff = num1[len1 - 1 - i] - num2[len2 - 1 - i] - iBorrow;		 
			if (iDiff < 0) {
				iDiff += 10;
				iBorrow = 1;
			}
			else {
				iBorrow = 0;
			}
			sResult.Add(iDiff + _t('0'));
		} 

		if (iBorrow != 0){
			bool bBorrow = false;
			for (int i = len2; i < len1; i++){
				_char c = num1[len1 - i - 1];
				if (!bBorrow){
					if (c == _t('0')) {
						sResult.Add(_t('9'));
					}else{
						sResult.Add(c - 1);
						bBorrow = true;
					}
				}else{
					sResult.Add(c);
				}
			}
		}else{
			for (int i = len2; i < len1; i++){
				_char c = num1[len1 - i - 1];
				sResult.Add(c);
			}
		}	
		 
		sResult.TrimRight(_t('0'));  //除去尾部的0
		return sResult.Reversal();		 

	}else if(len1 == len2){//字符长度相等
		if (num1 > num2){
			int iBorrow = 0;
			for (int i = 0; i < len2; i++) {
				int iDiff = num1[len1 - 1 - i] - num2[len2 - 1 - i] - iBorrow;
				if (iDiff < 0) {
					iDiff += 10;
					iBorrow = 1;
				}
				else {
					iBorrow = 0;
				}
				sResult.Add(iDiff + _t('0'));
			}
			sResult.TrimRight(_t('0')); //除去尾部的0
			return sResult.Reversal();
		}else if(num1 == num2){
			return _t("0");
		}else{
			int iBorrow = 0;
			for (int i = 0; i < len2; i++) {
				int iDiff = num2[len1 - 1 - i] - num1[len2 - 1 - i] - iBorrow;
				if (iDiff < 0) {
					iDiff += 10;
					iBorrow = 1;
				}
				else {
					iBorrow = 0;
				}
				sResult.Add(iDiff + _t('0'));
			}
			 
			sResult.TrimRight(_t('0')); //除去尾部的0
			sResult.Add(_t('-'));
			
			return sResult.Reversal();
		}

	}else{  //len1 < len2  小数减大数
		int iBorrow = 0;
		for (int i = 0; i < len1; i++) {
			int iDiff = num2[len2 - 1 - i] - num1[len1 - 1 - i] - iBorrow;
			if (iDiff < 0) {
				iDiff += 10;
				iBorrow = 1;
			}
			else {
				iBorrow = 0;
			}
			sResult.Add(iDiff + _t('0'));
		}

		if (iBorrow != 0) {  //还需借一位
			bool bBorrow = false;
			for (int i = len1; i < len2; i++) {
				_char c = num2[len2 - i - 1];
				if (!bBorrow) {
					if (c == _t('0')) {
						sResult.Add(_t('9'));
					}
					else {
						sResult.Add(c - 1);
						bBorrow = true;
					}
				}
				else {
					sResult.Add(c);
				}
			}
		}
		else {
			for (int i = len1; i < len2; i++) {
				_char c = num2[len2 - i - 1];
				sResult.Add(c);
			}
		}

	
		sResult.TrimRight(_t('0'));
		sResult.Add(_t("-"));
		return sResult.Reversal();
	}

}

std::string _Integer::Subtract_std(const std::string& num1, const std::string& num2)
{
	int len1 = num1.size();
	int len2 = num2.size();
	int maxLen = std::max(len1, len2);
	std::string result(maxLen, '0');

	int iBorrow = 0;
	for (int i = 0; i < maxLen; i++) {
		int iDiff = num1[len1 - 1 - i] - num2[len2 - 1 - i] - iBorrow;
		if (iDiff < 0) {
			iDiff += 10;
			iBorrow = 1;
		}
		else {
			iBorrow = 0;
		}
		result[maxLen - 1 - i] = iDiff + '0';
	}

	result.erase(std::find_if(result.rbegin(), result.rend(), [](char ch) { return ch != '0'; }).base(), result.end());

	return result;
}
  
 
/// <summary>
/// 无符号的两个整数相剩 (参考自星飞星火)
/// 【中文】:两个数相乘
/// 【英文】:Multiplication of two numbers
/// </summary>
/// <param name="sNum1"></param>
/// <param name="sNum2"></param>
/// <returns></returns>
/// 创建时间:2024-04-21    最后一次修改时间:2024-04-21  (已测试)
_string _Integer::Multiplication(const _string& sNum1, const _string& sNum2,  bool isCheckForamt)
{
	if (isCheckForamt) { Check(sNum2);	Check(sNum2); }

	  /*
		int len1 = num1.size();
		int len2 = num2.size();
		std::vector<int> result(len1 + len2, 0);

		for (int i = len1 - 1; i >= 0; i--) {
			for (int j = len2 - 1; j >= 0; j--) {
				int product = (num1[i] - '0') * (num2[j] - '0');
				int sum = result[i + j + 1] + product;
				result[i + j + 1] = sum % 10;
				result[i + j] += sum / 10;
			}
		}

		std::string res;
		for (int num : result) {
			if (!res.empty() || num != 0) {
				res.push_back(num + '0');
			}
		}

		return res.empty() ? "0" : res;
	  */
	 
	size_t len1 = sNum1.Length;
	size_t len2 = sNum2.Length;

	_Array<_byte> result(len1 + len2);   //设置缓冲长度为 len1 + len2
	result.ZeroBufferAll();            //把缓冲区初始为0
	result.ResetLength(len1 + len2);  //重设长度

	/*
	123
	 11

		33    (3)  i = 2 j = 1(个位+3) i + j = 3 刚好是第4位 (3) i = 2 j = 0  (十位加3)
	   22
	  11	
	________
	  1353 
	*/
	for (int i = len1 - 1; i >= 0; i--) {
		for (int j = len2 - 1; j >= 0; j--) {
			int product = (sNum1[i] - '0') * (sNum2[j] - '0'); //总量 n * n
			int sum = result[i + j + 1] + product;  //
			result[i + j + 1] = sum % 10; 
			result[i + j] += sum / 10;
		}
	}

	_string sTmp(_t(""), result.Length);
	
	/*
	//15*15 = 0225  (第一位是0)
	size_t nStart = (*result.Data == 0) ? 1 : 0;
 
	for(size_t n = nStart; n < result.Length; ++n)		 
		sTmp.Add( *(result.Data + n) + 48);
	*/

	for (_byte b : result) {
		if (sTmp.Length > 0 || b != 0) {  //如果前面有非零的数字,则添加 
			sTmp.Add(b + 48);
		}
	}

	return sTmp.Length == 0 ? _t("0") : sTmp;
}

 
/// <summary>
/// sNum1 / sNum2 ,sNum1 的倍数受制于int所能表达的最大值
/// </summary>
/// <param name="sNum1"></param>
/// <param name="sNum2"></param>
/// <param name="isCheckForamt"></param>
/// <returns></returns>
/// 创建时间:2024-04-26    最后一次修改时间:2024-04-27  (已测试)
_Pair<int, _string> _Integer::SmallDiv(const _string& sNum1, const _string& sNum2, bool isCheckForamt)
{
	if (isCheckForamt) { Check(sNum1);	Check(sNum2); }

	if (sNum2 == _t("0"))
	{
		
		d.PrintError(_t("除数不能为零"), _t("_Integer::SmallDiv"));
		assert(false);
	}

	if (sNum1.Length < sNum2.Length)
		return _Pair<int, _string>(0, sNum1);

	if (sNum1.Length == sNum2.Length)
	{
		if (sNum1 > sNum2)
		{
			int nNear = (sNum1[0] - 48) / (sNum2[0] - 48 ) + 1;
		
			for (int n = nNear; n > 0; --n)
			{
				_string sn = ga.intToString(n);
				_string s = _Integer::Multiplication(sNum2, sn, false); //乘积
				_string r = _Integer::Subtract(sNum1, s, false); //余数


				if (r[0] == _t('-'))
				{

				}
				else if (r == _t("0"))
				{
					return _Pair<int, _string>(n, _t("0"));
				}	
				else
				{
					if (r.Length < sNum2.Length)
					{
						return _Pair<int, _string>(n, r);
					}
					else if (r.Length == sNum2.Length)
					{
						if (r < sNum2)
						{
							return _Pair<int, _string>(n, r);
						}
						else if (r == sNum2)
						{
							return _Pair<int, _string>(n + 1, _t("0"));
						}
					}
				}
			}
		}
		else if (sNum1 == sNum2)
		{
			return _Pair<int, _string>(1, _t("0"));
		}
		else
		{
			return _Pair<int, _string>(0, sNum1);
		}
	}
	else //sNum1.Length > sNum2.Length
	{
		int nNear =  _Math::pow(10, sNum1.Length - sNum2.Length) * (sNum1[0] -48 + 1) - 1;

		//_pin(nNear);

		for (int n = nNear; n > 0; --n)
		{
			_string sn = ga.intToString(n);
			_string s = _Integer::Multiplication(sNum2, sn, false); //乘积
			_string r = _Integer::Subtract(sNum1, s, false); //余数
				
			if (r[0] == _t('-'))
			{

			}
			else if (r == _t("0"))
			{
				return _Pair<int, _string>(n, _t("0"));
			}
			else
			{
				if (r.Length < sNum2.Length)
				{
					return _Pair<int, _string>(n, r);
				}
				else if (r.Length == sNum2.Length)
				{
					if (r < sNum2)
					{
						return _Pair<int, _string>(n, r);
					}
					else if (r == sNum2)
					{
						return _Pair<int, _string>(n + 1, _t("0"));
					}
				}

			}
		}
	}

	std::wcout <<  _t("错误:\n");
	_pcn(sNum1);
	_pcn(sNum2);

	assert(false);

	return _Pair<int, _string>(0, _t("错误!"));
}

/// <summary>
/// 【单词中英文对照】:两个数相除 - Divide two numbers
/// 
/// 百度文心一言和星飞星火结果不对。
/// </summary>
/// 创建时间:2024-04-25    最后一次修改时间:2024-04-26   (已测式,这个函数用了大约1整天时间,搞死人)
_string _Integer::Divide(const _string& sNum1, const _string& sNum2,bool isCheckForamt)
{	 
	if (isCheckForamt) { Check(sNum1);	Check(sNum2); }

	 
	if (sNum2 == _t("0"))
	{
		_string sError = _t("_string _Integer::Divide: 除数 sNum2 不能为零不能为 0  !");

		_cout << sError <<"\n";

		assert(false);		 
	}


	_string sResult(_t(""), sNum1.Length);
 
	//2024/4 nPos =  4-1 = 3     sSub = 24  Point = 2 - 1 - 1(2<4) = 0   s = sSub ""
	//2124/4 nPos =  4-1 = 3
	//2124/23 nPos = 4-2 - 1 = 1
	 
	_string sSub = sNum1.SubStr(0, sNum2.Length); //除数

	auto p = SmallDiv(sSub, sNum2, false);

	int nStart = sNum2.Length;

	//获取第一位,确保第一次 p.Fist不等于0
	if (p.First == 0) {

		sSub = sNum1.SubStr(0, sNum2.Length + 1);
	 
		p = SmallDiv(sSub, sNum2, false);

		nStart = sNum2.Length + 1;
	}
		

	for( int i = nStart; i <=  sNum1.Length; ++i){

		if (p.First > 0) {//商不为0 

			sResult.Add(_tostr(p.First));

			if (p.Second == _t("0")) { //商不为0,余数为0

				sSub = sNum1.SubStr(i, 1);		

			}else{	 //商不为0,余数不为0

				sSub = p.Second + sNum1.SubStr(i, 1);	
			}

			if(sSub.Length > 0)
				p = SmallDiv(sSub, sNum2, false);

		}else {     //--------------------------------商为零

			sResult.Add(_t("0"));

			if (p.Second == _t("0")) { //--------------商为0,余数为0
				sSub = sNum1.SubStr(i, 1); 
			}
			else {	//----------------------------商为0,余数不为0			
				sSub = p.Second + sNum1.SubStr(i, 1);
			}

			if (sSub.Length > 0)
				p = SmallDiv(sSub, sNum2, false);
		}		
	}
	
	return sResult;
	 
}

_Integer::_Integer()
{
	_InitData();

	_num = "0";
}

_Integer::_Integer(const _Integer& integer)
{
	_num = integer._num;

	_IsNegative = integer._IsNegative;
}

_Integer::_Integer(const int& iValue)
{
	if (iValue < 0){
		_IsNegative = true;
		_num = _tostr(-iValue);
	}else{
		_IsNegative = false;
		_num = _tostr(iValue);
	} 
}
 
_Integer::_Integer(const _string& sNum)
{
	assert(sNum.Length > 0);

	if (sNum[0] == _t('-')){
		_IsNegative = true;

		_num = sNum.SubStr(1, sNum.Length - 1);

	}else{
		_IsNegative = false;

		_num = sNum;
	}

	Check(_num);
}
 
_Integer::_Integer(const _char* pStr)
{
	assert(pStr != null);

	_string sNum(pStr);

	assert(sNum.Length != 0);


	if (sNum[0] == _t('-')) {
		_IsNegative = true;

		_num = sNum.SubStr(1, sNum.Length - 1);

	}
	else {
		_IsNegative = false;

		_num = sNum;
	}

	Check(_num);
}



bool _Integer::operator==(const int& iVlue)
{
	if (iVlue > 0) {
		_string sNum = _tostr(iVlue);
		return _num == sNum && _IsNegative == false;
	}else {
		_string sNum = _tostr(-iVlue);
		return _num == sNum && _IsNegative == true;
	} 
}


 

_Integer _Integer::operator*(const _Integer& right) const
{
	_Integer sum;

	sum._num = Multiplication(_num, right._num);

	sum._IsNegative = !((_IsNegative && right._IsNegative) || (!_IsNegative && !right._IsNegative));

	return sum;
}

_Integer _Integer::operator/(const _Integer& r) const
{
	_Integer tmp;

	tmp._num = _Integer::Divide(_num, r._num);

	tmp._IsNegative = (_IsNegative != r._IsNegative);

	return tmp;
}


_Integer _Integer::operator+(const _Integer& right) const
{
	if (_IsNegative == false && right._IsNegative == false) {//丙个正数相加
		_Integer tmp;

		tmp._num = Add(_num, right._num); 

		return tmp;
	}
	else if (_IsNegative == false && right._IsNegative == true) { //正数+负数
		return  *this - (-right);
	}
	else if (_IsNegative == true && right._IsNegative == false) { //负数+正数
		return right - (-*this);
	}
	else if (_IsNegative == true && right._IsNegative == true) { //两个负数相加
		return -((-*this) + (-right));
	}
}



_Integer _Integer::operator-(const _Integer& right) const
{
	if (*this < right)
	{
		return -(right - *this);
	}else{

		if (_IsNegative == false && right._IsNegative == false) {//丙个正数相减
 
			return Subtract(_num, right._num);
		}
		else if (_IsNegative == false && right._IsNegative == true) { //正数-负数
			return  *this + (-right);
		}
		else if (_IsNegative == true && right._IsNegative == false) { //负数-正数
			return -((-*this) + right);
		}
		else if (_IsNegative == true && right._IsNegative == true) { //两个负数相减
			return (-right) - *this;
		}
	}

}



/// <summary>
/// 前置加加
/// </summary>
/// <returns></returns>
_Integer& _Integer::operator++()
{	 
	_num = Add(_num, "1");
	 
	return *this;
}

_Integer& _Integer::operator--()
{
	_num = Subtract(_num, "1");

	return *this;
}

_Integer _Integer::operator++(int)
{
	_string sNum = _num;

	_num = Add(_num, "1");

	return sNum;	 
}


_Integer _Integer::operator--(int)
{
	_string sNum = _num;

	_num = Subtract(_num, "1");

	return sNum;
}

_Integer _Integer::operator-() const
{
	//前缀负号
	_Integer iResult = *this;
	iResult._IsNegative = !iResult._IsNegative;

	return iResult;
}

 
 


_string _Integer::ToSplitString(const _string& splitString) const
{
	if (_IsNegative)
		return _t("-") + _num;
	else 
		return _num;
   
}


bool operator>(const _Integer& l, const _Integer& r)
{ 
	if (l._IsNegative == true && r._IsNegative == true) // - - 两个负数
	{
		if (l._num.Length > r._num.Length)
			return false;
		else if (l._num.Length == r._num.Length)
			return l._num < r._num;
		else
			return true;
	}
	else if (l._IsNegative == true && r._IsNegative == false) //- +
	{  
		return false;
	}
	else if (l._IsNegative == false && r._IsNegative == true)  //+ -
	{
		if (l._num != _t("") || r._num != _t(""))
			return true;
		else
			return false;
	}
	else if (l._IsNegative == false && r._IsNegative == false) //+ +
	{
		if (l._num.Length > r._num.Length)
			return true;
		else if (l._num.Length == r._num.Length)
			return l._num  > r._num;
		else
			return false;
	}

	return false;
}


bool operator<(const _Integer& l, const _Integer& r)
{
	if (l > r)
		return false;
	if (l == r)
		return false;

	return true;
}



bool operator==(const _Integer& l, const _Integer& r)
{
	return l._IsNegative == r._IsNegative && l._num == r._num;
}

bool operator!=(const _Integer& l, const _Integer& r)
{
	if (l == r)
		return false;

	return true;
}

_LF_END_

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1629320.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringCloud02(远程调用Feign,网关Gateway,配置中心Nacos)

目录 一、远程调用Feign【要会用】 1. Feign简介 1 什么是Feign 2 准备基础代码 2. Feign入门【重点】 步骤 实现 测试 3. Feign配置Ribbon 1 说明 2 配置 4. Feign配置日志 1 说明 2 步骤 5. Feign使用优化 1 说明 2 步骤 6. 小结 二、网关Gateway 1. 网关…

基于深度学习神经网络的AI图片上色DDcolor系统源码

第一步&#xff1a;DDcolor介绍 DDColor 是最新的 SOTA 图像上色算法&#xff0c;能够对输入的黑白图像生成自然生动的彩色结果&#xff0c;使用 UNet 结构的骨干网络和图像解码器分别实现图像特征提取和特征图上采样&#xff0c;并利用 Transformer 结构的颜色解码器完成基于视…

xfce4 panel 不能显示QQ,钉钉的状态图标

有一段时间不能显示了&#xff0c;之前刚装完系统的时候很长时间内都是好的&#xff0c;所以刚开始肯定是支持显示这些状态图标的。就是因为不能显示的原因&#xff0c;所以还装了lxQt桌面&#xff0c;这个桌面确实不错。不过还是有时会怀念xfce4&#xff0c;想看看能不能解决这…

面经总结(二)(数据库)

数据库常识&#xff1a; 1、数据库系统包含什么&#xff1f; 包含了数据库、数据库管理系统、数据库管理员和应用程序。 数据库&#xff08;DB)&#xff1a;顾名思义是存放数据的仓库&#xff0c;实现数据的持久化。 数据库管理系统&#xff08;DBMS)&#xff1a;类似于操作系…

利用ollama和open-webui本地部署通义千问Qwen1.5-7B-Chat模型

目录 1 安装ollama 2 安装open-webui 2.1 镜像下载 3 配置ollama的模型转换工具环境 3.1 下载ollama源码 3.2 下载ollama子模块 3.3 创建ollama虚拟环境 3.4 安装依赖 3.5 编译量化工具 7 创建ollama模型 8 运行模型 参考文献&#xff1a; 1 安装ollama curl -fsSL …

(GEE)2000-2020年黄河流域时序渐变图及高程模型计算 JavaScript版

文章目录 一. 选取目标区域二. NDVI实现三. 高程模型DEM实现四. 时序图五. 植被覆盖类型六. 参考文献 首先推荐吴秋生老师团队开源的便捷构建网站&#xff1a;适用于地理空间应用的Streamlight 吴秋生老师团队的工具请自行探索。本文讲解基于GEE云开发平台实现&#xff0c;基于…

关于springboot内置tomcat最大请求数配置的一些问题

前言 springboot内置了tomcat。那么一个springboot web应用&#xff0c;最大的请求链接数是多少呢&#xff1f;很早以前就知道这个是有个配置&#xff0c;需要的时候&#xff0c;百度一下即可。但&#xff0c;事实并非如此&#xff0c;有几个问题我想大多数人还真不知道。比如…

机械图纸管理系统,如何选择适合的机械图纸管理系统?

机械图纸管理系统是一种专门用于管理和跟踪机械制造过程中的图纸、设计文件和相关信息的软件系统。例如&#xff1a;彩虹图纸管理系统&#xff0c;这种系统能够有效地整合和管理工程图纸、零部件清单、技术规范、工艺流程等各种数据&#xff0c;为企业提供全面的图纸管理和协作…

typescript:vscode的settings配置文件配置ts语法提示

typescript&#xff1a;vscode的settings配置文件配置ts语法提示 1 找到vscode左下角的齿轮按钮 2 点击Settings&#xff08;或者快捷键ctrl,&#xff09;&#xff1a; 点击右上角的Open Settings(JSON)按钮打开配置文件&#xff1a; 或者ctrlshiftp&#xff0c;搜索settings&…

嵌入式全栈开发学习笔记---Linux基本命令1

目录 cd加路径 相对路径是什么 绝对路径是什么 cd后面没有路径 cd- ls -l ls -a ls -al ls加路径 Linux的命令是数不清的&#xff0c;就像很多应用软件一样&#xff0c;随时都有可能被开发出来。 但是我们目前阶段只需要掌握基本的命令就可以了。 上一篇博文中我已经…

元宇宙APP搭建重点,会用到哪些三方服务?

元宇宙APP的搭建是一个综合性的项目&#xff0c;涉及到众多关键要素和第三方服务。以下是一些元宇宙APP搭建的重点&#xff0c;以及可能用到的第三方服务&#xff1a; 一、搭建重点 技术框架的选择与搭建&#xff1a;元宇宙APP需要稳定、高效的技术框架来支撑其运行。这包括前…

插入排序,搞起来,一路狂奔,数组插入

一点喽 目录 编程实现&#xff1a;程序功能是在一个有序序列中插入一个数后&#xff0c;该数列依然有序 输入测试数据&#xff1a;2 3 5 7 8 23 34 56 78 90 25 程序运行结果&#xff1a;插入之后的数组为 2 3 5 7 8 23 25 34 56 78 90 第一个就…

如何增强交友、婚恋平台、金融等平台的安全性

运营商二要素核验是一种数字身份验证方法&#xff0c;主要使用用户的手机号码和姓名作为核验要素。这两个要素被认为是最基本的用户身份信息&#xff0c;通过运营商的数据库来核实其真实性。 在实际操作中&#xff0c;用户需要提供手机号码和姓名进行验证。应用系统会调用接口…

unity的特性AttriBute详解

unity的特性AttriBute曾经令我大为头疼。因为不动使用的法则&#xff0c;但是教程都是直接就写&#xff0c;卡住就不能继续学下去。令我每一次看到&#xff0c;直接不敢看了。 今天使用文心一言搜索一番&#xff0c;发现&#xff0c;恐惧都是自己想象的&#xff0c;实际上这个…

Docker之存储配置与管理

一、容器本地配置与Docker存储驱动 每个容器都被自动分配了本地存储&#xff0c;也就是内部存储。容器由一个可写容器层和若干只读镜像层组成&#xff0c;容器的数据就存放在这些层中。 容器本地存储采用的是联合文件系统。这种文件系统将其他文件系统合并到一个联合挂载点&a…

Unity类银河恶魔城学习记录15-5,6 p157 Audio time limiter p158 Area sound

Alex教程每一P的教程原代码加上我自己的理解初步理解写的注释&#xff0c;可供学习Alex教程的人参考 此代码仅为较上一P有所改变的代码 【Unity教程】从0编程制作类银河恶魔城游戏_哔哩哔哩_bilibili​​ AreaSound.cs using System.Collections; using System.Collections.G…

Spring boot + Redis + Spring Cache 实现缓存

学习 Redis 的 value 有 5 种常用的数据结构 Redis 存储的是 key-value 结构的数据。key 是字符串类型&#xff0c;value 有 5 种常用的数据结构&#xff1a; Redis 的图形化工具 Another Redis Desktop Manager Spring Data Redis Redis 的 Java 客户端。 Spring Cache Spr…

Pycharm新建工程时使用Python自带解释器的方法

Pycharm新建工程时使用Python自带解释器的方法 新建Project时最好不要新建Python解释器&#xff0c;实践证明&#xff0c;自己新建的Python解释器容易出现各种意想不到的问题。 那么怎样使用Python安装时自带的解释器呢&#xff1f; 看下面的三张截图大家就清楚了。 我的Pyth…

avl excite python二次开发1--python解释器需用内置解释器aws_cmd

avl excite python二次开发1--python解释器需用内置解释器aws_cmd 1、python解释器问题1.1、用外置python解释器&#xff0c;import WSInterface会失败(WSInterface.pyd)1.2、用内置解释器aws_cmd运行py脚本1.3 用内置解释器aws_python执行脚本三级目录 1、python解释器问题 1…

Python_AI库 matplotlib扩展知识

Python_AI库 matplotlib扩展知识 在数据分析和处理的领域里&#xff0c;可视化是一种不可或缺的手段。通过图形化的展示&#xff0c;我们可以更直观地理解数据的分布、趋势和关系。而matplotlib&#xff0c;作为Python中最为流行的数据可视化库之一&#xff0c;以其强大的功能…