⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hugeint.h

📁 HugeCalc 是一款高精度算法库
💻 H
字号:
// HugeInt.h: interface for the CHugeInt class.
//
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HUGEINT_H__5B7DCBAC_6D89_4C55_B51F_D96B5E741B51__INCLUDED_)
#define AFX_HUGEINT_H__5B7DCBAC_6D89_4C55_B51F_D96B5E741B51__INCLUDED_

#if _MSC_VER > 1000
	#pragma once
#endif // _MSC_VER > 1000

#include "HugeCalc.h"
class CInterior;
class CHugeInt;

#ifndef _CHUGEINT_VECTOR
    #define _CHUGEINT_VECTOR
    typedef vector< CHugeInt, HC_ALLOC > CHUGEINT_VECTOR;
#endif // !defined(_CHUGEINT_VECTOR)

#ifndef _LPCHUGEINT_VECTOR
    #define _LPCHUGEINT_VECTOR
    typedef vector< CONST CHugeInt *, HC_ALLOC > LPCHUGEINT_VECTOR;
#endif // !defined(_LPCHUGEINT_VECTOR)

#define HUGEINT_API HUGECALC_API

class HUGEINT_API CHugeInt
{
	friend class CHugeIntX;
	// CompareAbs
	HUGEINT_API friend CONST SINT8 CompareAbs( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST SINT8 CompareAbs( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST SINT8 CompareAbs( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST SINT8 CompareAbs( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST SINT8 CompareAbs( CONST CHugeInt& left, CONST CHugeInt& right );

	// Compare
	HUGEINT_API friend CONST SINT8 Compare( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST SINT8 Compare( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST SINT8 Compare( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST SINT8 Compare( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST SINT8 Compare( CONST CHugeInt& left, CONST CHugeInt& right );

	// relation operators
	HUGEINT_API friend CONST BOOL operator ==( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST BOOL operator ==( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator ==( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST BOOL operator ==( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST BOOL operator ==( CONST CHugeInt& left, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator !=( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST BOOL operator !=( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator !=( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST BOOL operator !=( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST BOOL operator !=( CONST CHugeInt& left, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator <( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST BOOL operator <( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator <( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST BOOL operator <( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST BOOL operator <( CONST CHugeInt& left, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator <=( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST BOOL operator <=( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator <=( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST BOOL operator <=( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST BOOL operator <=( CONST CHugeInt& left, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator >( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST BOOL operator >( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator >( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST BOOL operator >( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST BOOL operator >( CONST CHugeInt& left, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator >=( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST BOOL operator >=( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST BOOL operator >=( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST BOOL operator >=( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST BOOL operator >=( CONST CHugeInt& left, CONST CHugeInt& right );

	// +
	HUGEINT_API friend CONST CHugeInt operator +( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST CHugeInt operator +( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST CHugeInt operator +( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST CHugeInt operator +( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST CHugeInt operator +( CONST CHugeInt& left, CONST CHugeInt& right );

	// -
	HUGEINT_API friend CONST CHugeInt operator -( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST CHugeInt operator -( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST CHugeInt operator -( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST CHugeInt operator -( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST CHugeInt operator -( CONST CHugeInt& left, CONST CHugeInt& right );

	// *
	HUGEINT_API friend CONST CHugeInt operator *( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST CHugeInt operator *( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST CHugeInt operator *( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST CHugeInt operator *( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST CHugeInt operator *( CONST CHugeInt& left, CONST CHugeInt& right );

	// Division, return quotient
	HUGEINT_API friend CONST SINT64 Div( CONST UINT32 u32Dividend, CONST CHugeInt& divisor, UINT32 * CONST pRemainder = NULL );
	HUGEINT_API friend CONST SINT32 Div( CONST SINT32 s32Dividend, CONST CHugeInt& divisor, SINT32 * CONST pRemainder = NULL );

	// /
	HUGEINT_API friend CONST SINT64 operator /( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST SINT32 operator /( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST CHugeInt operator /( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST CHugeInt operator /( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST CHugeInt operator /( CONST CHugeInt& left, CONST CHugeInt& right );

	// %
	HUGEINT_API friend CONST UINT32 operator %( CONST UINT32 u32Num, CONST CHugeInt& right );
	HUGEINT_API friend CONST SINT32 operator %( CONST SINT32 s32Num, CONST CHugeInt& right );

	HUGEINT_API friend CONST SINT64 operator %( CONST CHugeInt& left, CONST UINT32 u32Num );
	HUGEINT_API friend CONST SINT32 operator %( CONST CHugeInt& left, CONST SINT32 s32Num );

	HUGEINT_API friend CONST CHugeInt operator %( CONST CHugeInt& left, CONST CHugeInt& right );

public:
	// Constructor
	explicit CHugeInt( VOID );
	explicit CHugeInt( CONST UINT32& u32Num );
	explicit CHugeInt( CONST SINT32& s32Num );
	explicit CHugeInt( CONST UINT64& u64Num );
	explicit CHugeInt( CONST SINT64& s64Num );
	explicit CHugeInt( CONST LPCTSTR lpszNum );
	explicit CHugeInt( CONST CARRY_PARAM& CarryParam );
	explicit CHugeInt( CONST CHugeInt& right );
	explicit CHugeInt( CONST CHugeIntX& right );

	// destructor
	/*virtual */~CHugeInt( );

	static CONST SIZE_T GetCount( VOID );

	// reload operator ->
	CHugeInt * CONST operator ->( VOID );

	// get property
	CONST BOOL operator !( VOID ) CONST;
	CONST BOOL IsAbsOne( VOID ) CONST;
	CONST BOOL IsOdd( VOID ) CONST;
	CONST BOOL IsEven( VOID ) CONST;
	CONST SINT8 GetSign( VOID ) CONST;
	CONST SIZE_T GetDigitals( VOID ) CONST;
	CONST BOOL CanConvertSINT64( SINT64& s64Num ) CONST;

	CONST CHugeInt Abs( VOID ) CONST;
	CONST CHugeInt operator -( VOID ) CONST;

	CHugeInt& Negate( VOID );
 	CHugeInt& Swap( CHugeInt& right );

	// reload operators
	CHugeInt& operator =( CONST UINT32& u32Num );
	CHugeInt& operator =( CONST SINT32& s32Num );
	CHugeInt& operator =( CONST UINT64& u64Num );
	CHugeInt& operator =( CONST SINT64& s64Num );
	CHugeInt& operator =( CONST LPCTSTR lpszNum );
	CHugeInt& operator =( CONST CARRY_PARAM& CarryParam );
	CHugeInt& operator =( CONST CHugeInt& right );
	CHugeInt& operator =( CONST CHugeIntX& right );

	CHugeInt& operator +=( CONST UINT32 u32Num );
	CHugeInt& operator +=( CONST SINT32 s32Num );
	CHugeInt& operator +=( CONST CHugeInt& right );

	CHugeInt& operator ++( VOID );
	CONST CHugeInt operator ++( CONST INT );

	CHugeInt& operator -=( CONST UINT32 u32Num );
	CHugeInt& operator -=( CONST SINT32 s32Num );
	CHugeInt& operator -=( CONST CHugeInt& right );

	CHugeInt& operator --( VOID );
	CONST CHugeInt operator --( CONST INT );

	CHugeInt& operator *=( CONST UINT32 u32Num );
	CHugeInt& operator *=( CONST SINT32 s32Num );
	CHugeInt& operator *=( CONST CHugeInt& right );

	CHugeInt& operator /=( CONST UINT32 u32Num );
	CHugeInt& operator /=( CONST SINT32 s32Num );
	CHugeInt& operator /=( CONST CHugeInt& right );

	CHugeInt& operator %=( CONST UINT32 u32Num );
	CHugeInt& operator %=( CONST SINT32 s32Num );
	CHugeInt& operator %=( CONST CHugeInt& right );

	CHugeInt& operator <<=( CONST UINT32 u32LShift );
	CHugeInt& operator >>=( CONST UINT32 u32RShift );

	CONST CHugeInt operator <<( CONST UINT32 u32LShift ) CONST;
	CONST CHugeInt operator >>( CONST UINT32 u32RShift ) CONST;

	CHugeInt& operator &=( CONST CHugeInt& right );
	CHugeInt& operator ^=( CONST CHugeInt& right );
	CHugeInt& operator |=( CONST CHugeInt& right );

	CONST CHugeInt operator &( CONST CHugeInt& right ) CONST;
	CONST CHugeInt operator ^( CONST CHugeInt& right ) CONST;
	CONST CHugeInt operator |( CONST CHugeInt& right ) CONST;

	// notice: base on decimal system !!
	CHugeInt& LShift( CONST UINT32 u32LDecShift );
	CHugeInt& RShift( CONST UINT32 u32RDecShift );

	// Multiplication, return product
	CHugeInt& Mul( CONST UINT32 u32Multiplicand, CONST CHugeInt& multiplier );
	CHugeInt& Mul( CONST SINT32 s32Multiplicand, CONST CHugeInt& multiplier );

	CHugeInt& Mul( CONST CHugeInt& multiplicand, CONST UINT32 u32Multiplier );
	CHugeInt& Mul( CONST CHugeInt& multiplicand, CONST SINT32 s32Multiplier );

	CHugeInt& Mul( CONST CHugeInt& multiplicand, CONST CHugeInt& multiplier );

	// Division, return quotient
	CHugeInt& Div( CONST CHugeInt& dividend, CONST UINT32 u32Divisor, SINT64 * CONST pRemainder = NULL );
	CHugeInt& Div( CONST CHugeInt& dividend, CONST SINT32 s32Divisor, SINT32 * CONST pRemainder = NULL );

	CHugeInt& Div( CONST CHugeInt& dividend, CONST CHugeInt& divisor, CHugeInt * CONST pRemainder = NULL );

	CHugeInt& Pow( CONST UINT32 r );
	CHugeInt& Pow( CONST CHugeInt& hugeBase, CONST UINT32 r );

	// Extraction
	CHugeInt& Root( CONST CHugeInt& radicand, CONST UINT32 r, CHugeInt * CONST pRemainder = NULL, BOOL * CONST pIsReal = NULL );

	// Logarithm
	CONST UINT32 Log( CONST UINT32 u32Base, BOOL * CONST pIsExact = NULL ) CONST;
	CONST UINT32 Log( CONST CHugeInt& hugeBase, BOOL * CONST pIsExact = NULL ) CONST;

	// PowMod
	CHugeInt& PowMod( CONST UINT32 u32Base, CONST UINT32 r, CONST CHugeInt& hugeMod );
	CHugeInt& PowMod( CONST SINT32 s32Base, CONST UINT32 r, CONST CHugeInt& hugeMod );
	CHugeInt& PowMod( CONST CHugeInt& hugeBase, CONST UINT32 r, CONST CHugeInt& hugeMod );

	// Fibonacci
	CHugeInt& Fibonacci( CONST UINT32 n );

	// Factorial, Permutation, Combination
	CHugeInt& Factorial( CONST UINT32 n, CONST BOOL bDouble = FALSE );
	CHugeInt& Permutation( CONST UINT32 n, CONST UINT32 r );
	CHugeInt& Combination( CONST UINT32 n, CONST UINT32 r );

	// Greatest Common Divisor
	CHugeInt& Gcd( CONST UINT32 u32Num, CONST CHugeInt& right );
	CHugeInt& Gcd( CONST SINT32 s32Num, CONST CHugeInt& right );
	CHugeInt& Gcd( CONST CHugeInt& left, CONST UINT32 u32Num );
	CHugeInt& Gcd( CONST CHugeInt& left, CONST SINT32 s32Num );

	CHugeInt& Gcd( CONST CHugeInt& left, CONST CHugeInt& right );

	CHugeInt& Gcd( CONST CHUGEINT_VECTOR& vHugeInt );
	CHugeInt& Gcd( CONST LPCHUGEINT_VECTOR& vLpHugeInt );

	// Lowest Common Multiple
	CHugeInt& Lcm( CONST U32_VECTOR& vU32Num );

	CHugeInt& Lcm( CONST UINT32 u32Num, CONST CHugeInt& right );
	CHugeInt& Lcm( CONST SINT32 s32Num, CONST CHugeInt& right );
	CHugeInt& Lcm( CONST CHugeInt& left, CONST UINT32 u32Num );
	CHugeInt& Lcm( CONST CHugeInt& left, CONST SINT32 s32Num );

	CHugeInt& Lcm( CONST CHugeInt& left, CONST CHugeInt& right );

	CHugeInt& Lcm( CONST CHUGEINT_VECTOR& vHugeInt );
	CHugeInt& Lcm( CONST LPCHUGEINT_VECTOR& vLpHugeInt );

	CHugeInt& Product( CONST U32_VECTOR& vU32Num );
	CHugeInt& Product( CONST CHUGEINT_VECTOR& vHugeInt );
	CHugeInt& Product( CONST LPCHUGEINT_VECTOR& vLpHugeInt );

	// if r==0, then call function: Product( ... );
	CHugeInt& SumsOfLikePowers( CONST U32_VECTOR& vU32Num, CONST UINT32 r = 1 );
	CHugeInt& SumsOfLikePowers( CONST CHUGEINT_VECTOR& vHugeInt, CONST UINT32 r = 1 );
	CHugeInt& SumsOfLikePowers( CONST LPCHUGEINT_VECTOR& vLpHugeInt, CONST UINT32 r = 1 );

	// Output
	CONST LPCTSTR ConvertToStr( CONST BYTE byFormat = FS_DEFAULT, SIZE_T * CONST pStrLen = NULL ) CONST;
	// This function can convert the huge integer to a string of digits in another carry system.
	CONST LPCTSTR ConvertToStr( CONST UINT32 u32Carry /*= 16*/, UINT32 * CONST pDigitals = NULL, CONST BYTE byFormat = FS_DEFAULT, CONST UINT32 u32BandLength = 4, SIZE_T * CONST pStrLen = NULL ) CONST;
	VOID FreeStrBuffer( VOID ) CONST;

	CARRY_PARAM& ConvertToCarry( CARRY_PARAM& CarryParam ) CONST;

protected:

private:
	explicit CHugeInt( CONST CInterior &right );
	CHugeInt& operator =( CONST CInterior &right );

	CInterior * CONST m_pInterior;
};

#endif // !defined(AFX_HUGEINT_H__5B7DCBAC_6D89_4C55_B51F_D96B5E741B51__INCLUDED_)

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -