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

📄 hugeint.cpp

📁 CHugeInt
💻 CPP
字号:
// HugeInt.cpp: implementation of the CHugeInt class.
//
//////////////////////////////////////////////////////////////////////

#include "HugeInt.h"

#include <iostream>
#include <vector>
#include <math.h>
#include <assert.h>
using namespace std;

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

const int CHugeInt::m_ciWeight = 10000;

CHugeInt::CHugeInt()
{

}

CHugeInt::~CHugeInt()
{

}

CHugeInt::CHugeInt(int iSrc)
{
	Add(iSrc);
}

CHugeInt::CHugeInt(const CHugeInt& hiSrc)
{
	m_vecData = hiSrc.m_vecData;
}

inline void CHugeInt::Zero()
{
	m_vecData.clear();
}

void CHugeInt::Output()
{
	for (int i = 0; i < m_vecData.size(); i++)
	{
		if (i == 0)
		{
			printf("%d", m_vecData[m_vecData.size() - i - 1]);
		}
		else
		{
			printf("%04d", m_vecData[m_vecData.size() - i - 1]);
		}
	}
}

void CHugeInt::AddSmall(int iIndex, int iValue)
{
	// check parameters
	assert(iIndex <= m_vecData.size());
	assert(iValue < m_ciWeight);

	while ((iIndex < m_vecData.size())
		&& ((m_vecData[iIndex] + iValue) >= m_ciWeight) 
		)
	{
		m_vecData[iIndex] += iValue;
		iValue = m_vecData[iIndex]/m_ciWeight;
		m_vecData[iIndex] = m_vecData[iIndex]%m_ciWeight;
		iIndex++;
	}

	if (iIndex == m_vecData.size())
	{
		m_vecData.push_back(iValue);
	}
	else
	{
		m_vecData[iIndex] += iValue;
	}
}

inline void CHugeInt::Add(int iIndex, int iValue)
{
	// check parameters
	assert(iIndex <= m_vecData.size());

	do
	{
		AddSmall(iIndex, iValue%m_ciWeight);
		iValue = iValue/m_ciWeight;
		iIndex++;
	}while (iValue != 0);
}

inline CHugeInt& CHugeInt::Add(int iOperand)
{
	int iIndex = 0;
	do
	{
		AddSmall(iIndex, iOperand%m_ciWeight);
		iOperand = iOperand/m_ciWeight;
		iIndex++;
	}while (iOperand != 0);

	return *this;
}

CHugeInt& CHugeInt::Multiple(int iOperand)
{
	vector<int> vecA(m_vecData);
	m_vecData.clear();

	int j = 0;
	for (; j < vecA.size(); j++)
	{
		Add(j, iOperand * vecA[j]);
	}
	
	return *this;
}

inline CHugeInt& CHugeInt::operator = (int iOperand)
{
	m_vecData.clear();
	// 
	return Add(iOperand);
}

CHugeInt& CHugeInt::Add(const CHugeInt& hiOperand)
{
	int i = 0;
	for (; i < hiOperand.m_vecData.size(); i++)
	{
		AddSmall(i, hiOperand.m_vecData[i]);
	}

	return *this;
}

CHugeInt& CHugeInt::Multiple(const CHugeInt& hiOperand)
{
	vector<int> vecTemp;
	const vector<int>* pvecB;
	if (&hiOperand == this)
	{
		vecTemp = hiOperand.m_vecData;
		pvecB = &vecTemp;
	}
	else
	{
		pvecB = &hiOperand.m_vecData;
	}
	vector<int> vecA(m_vecData);
	m_vecData.clear();

	int i = 0;
	for (; i < pvecB->size(); i++)
	{
		int j = 0;
		for (; j < vecA.size(); j++)
		{
			Add(i + j, (*pvecB)[i] * vecA[j]);
		}
	}

	return *this;
}

CHugeInt& CHugeInt::operator = (const CHugeInt& hiOperand)
{
	// assign to self, thought need not
	if (&hiOperand == this)
	{
		return *this;
	}

	// 
	m_vecData = hiOperand.m_vecData;

	return *this;
}

⌨️ 快捷键说明

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