#pragma once
#include<deque>
#include<string>
namespace MyStd
{
class CBigInt;
class CUnsignedBigInt;
class MulBuffer;
class CUnsignedBigInt
{
protected:
friend class MulBuffer;
using valueType = uint32_t;
std::deque<valueType> m_data;//数字
static CUnsignedBigInt Mul(CUnsignedBigInt n1, valueType n2);//计算CUnsignedBigInt与一位数相乘的结果
void Reduced();//化简(去掉前导0)
public:
static const short m_radix = 10;//使用10进制存储,可以改,结果不会变
static inline const CUnsignedBigInt& UnsignedLongLongMax()noexcept;
static inline const CUnsignedBigInt& LongLongMax()noexcept;
CUnsignedBigInt();
CUnsignedBigInt(unsigned long long num);
CUnsignedBigInt(const CUnsignedBigInt& i);
CUnsignedBigInt(CUnsignedBigInt&& i);
CUnsignedBigInt(const std::string& source, uint8_t radix = 10);
size_t Size()const noexcept;//位数
valueType At(size_t index)const;
CUnsignedBigInt SubNum(size_t first, size_t count = 1)const;
virtual std::string ToString(uint8_t radix = 10)const;//radix范围为2-16
CUnsignedBigInt& operator=(unsigned long long num);
CUnsignedBigInt& operator=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator=(CUnsignedBigInt&& n);
virtual CUnsignedBigInt& operator=(const std::string& source);
virtual void Assign(const std::string& source, uint8_t radix = 10);
void Assign(unsigned long long num);
bool IsZero()const;
friend std::strong_ordering operator<=>(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2)noexcept;
static std::strong_ordering Compare(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend bool operator==(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend bool operator!=(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend CUnsignedBigInt operator+(CUnsignedBigInt n1, const CUnsignedBigInt& n2);
friend CUnsignedBigInt operator-(CUnsignedBigInt n1, const CUnsignedBigInt& n2);//计算差的绝对值
friend CUnsignedBigInt operator*(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
static CUnsignedBigInt Divide(const CUnsignedBigInt& n1, CUnsignedBigInt n2, CUnsignedBigInt& remainder);//除法,结果向0舍入,例如(-7)/5=-1
friend CUnsignedBigInt operator/(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
friend CUnsignedBigInt operator%(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
CUnsignedBigInt& operator+=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator-=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator*=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator/=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator%=(const CUnsignedBigInt& n);
CUnsignedBigInt& operator++();
CUnsignedBigInt& operator--();
CUnsignedBigInt operator++(int);
CUnsignedBigInt operator--(int);
static CUnsignedBigInt Add(CUnsignedBigInt n1, const CUnsignedBigInt& n2);
static CUnsignedBigInt Sub(CUnsignedBigInt n1, const CUnsignedBigInt& n2);
CBigInt operator-()const;
const CUnsignedBigInt& operator+()const noexcept;
static CUnsignedBigInt Pow(CUnsignedBigInt n, unsigned long long exponential);//使用快速幂
static CUnsignedBigInt Pow(const CUnsignedBigInt& n, CUnsignedBigInt exponential);//不使用快速幂
static CUnsignedBigInt GCD(CUnsignedBigInt n1, CUnsignedBigInt n2);
static CUnsignedBigInt LCM(const CUnsignedBigInt& n1, const CUnsignedBigInt& n2);
unsigned long long ToUnsignedLongLong()const;
virtual long double ToLongDouble()const;
};
class CBigInt :public CUnsignedBigInt
{
private:
friend class MulBuffer;
bool m_sign;//1正0负
public:
CBigInt();
CBigInt(long long num);
CBigInt(const CBigInt& i);
CBigInt(CBigInt&& i);
CBigInt(const CUnsignedBigInt& i);
CBigInt(CUnsignedBigInt&& i);
CBigInt(const std::string& source, uint8_t radix = 10);
CUnsignedBigInt Abs()const noexcept;
virtual std::string ToString(uint8_t radix = 10, bool ShowPlusSign = false)const;//radix范围为2-16
CBigInt& operator=(long long num);
CBigInt& operator=(const CBigInt& n);
CBigInt& operator=(CBigInt&& n);
virtual CBigInt& operator=(const std::string& source);
virtual void Assign(const std::string& source, uint8_t radix = 10);
static std::strong_ordering Compare(const CBigInt& n1, const CBigInt& n2);
friend std::strong_ordering operator<=>(const CBigInt& n1, const CBigInt& n2)noexcept;
friend bool operator==(const CBigInt& n1, const CBigInt& n2);
friend bool operator!=(const CBigInt& n1, const CBigInt& n2);
friend CBigInt operator+(CBigInt n1, const CBigInt& n2);
friend CBigInt operator-(CBigInt n1, const CBigInt& n2);
friend CBigInt operator*(CBigInt n1, const CBigInt& n2);
static CBigInt Divide(const CBigInt& n1, const CBigInt& n2, CBigInt& remainder);//除法,结果向0舍入,例如(-7)/5=-1
friend CBigInt operator/(const CBigInt& n1, const CBigInt& n2);
friend CBigInt operator%(const CBigInt& n1, const CBigInt& n2);
CBigInt& operator+=(const CBigInt& n);
CBigInt& operator-=(const CBigInt& n);
CBigInt& operator*=(const CBigInt& n);
CBigInt& operator/=(const CBigInt& n);
CBigInt& operator%=(const CBigInt& n);
CBigInt& operator