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

📄 very_long.cpp

📁 这是我编写的一个用于处理大数的very_long_int 类!
💻 CPP
字号:
#include "StdAfx.h"
#include "very_long_int.h"

very_long_int::very_long_int()
{
}

very_long_int very_long_int::operator +(const very_long_int& other_very_long)
{
	unsigned carry=0,
	 large_size,
	 partial_sum;
	very_long_int sum;
	if(digits.size()>other_very_long.digits.size())
		large_size=digits.size();
	else
		large_size=other_very_long.digits.size();
	for(unsigned i=0;i<large_size;i++)
	{
		partial_sum=least(i)+other_very_long.least(i)+carry;
		carry=partial_sum/10;
		sum.digits.push_back(partial_sum%10);
	}

	if(carry==1)
		sum.digits.push_back(carry);
	reverse(sum.digits.begin(),sum.digits.end());
	return sum;
}

char very_long_int::least(unsigned i)const
{
	if(i>=digits.size())
		return 0;
	else
		return digits[digits.size()-i-1];
}

very_long_int very_long_int::operator *(const very_long_int& other_very_long)
{
	very_long_int multi;
	very_long_int partial_sum;
	unsigned int mul_time;
	if (digits.size()<other_very_long.digits.size())
		mul_time=digits.size();
	else
		mul_time=other_very_long.digits.size();
	for (unsigned i=0;i<mul_time;i++)
	{
		partial_sum=Mul((int)other_very_long.least(i));
		for(unsigned j=0;j<i;j++)
			partial_sum.digits.push_back(0);
		multi=multi+partial_sum;
	}
	return multi;
}

very_long_int very_long_int::Mul(int n)
{
	very_long_int result;
	int partial_sum;
	int carry=0;
	for (unsigned i=0;i<digits.size();i++)
	{
		partial_sum=least(i)*n+carry;
		carry=partial_sum/10;
		result.digits.push_back(partial_sum%10);
	}
	if (carry>0)
		result.digits.push_back(carry);
	reverse(result.digits.begin(),result.digits.end());
	return result;
}

very_long_int very_long_int::Factorial(unsigned n)
{
	very_long_int result;
	result.digits.push_back(1);
	for (unsigned i=0;i<n;i++)
	{
		result=result.Mul(n-i);
	}
	return result;
}

istream& operator>> (istream& instream,very_long_int& very_long)
{
	const char LOWEST_DIGIT_CHAR='0';
	const char HIGNEST_DIGIT_CHAR='9';
	const char SENTINEL='X';
	char digit_char;
	
	very_long.digits.erase(very_long.digits.begin(),very_long.digits.end());
	
	do{
		instream>>digit_char;
		if((LOWEST_DIGIT_CHAR<=digit_char)&&
			(digit_char<=HIGNEST_DIGIT_CHAR))
			very_long.digits.push_back(digit_char-LOWEST_DIGIT_CHAR);
	}while(digit_char!=SENTINEL);
	return instream;
	
}

ostream& operator<<(ostream& outstream,const very_long_int very_long)
{
	for (unsigned i=0;i<very_long.digits.size();i++)
		outstream<<(int)very_long.digits[i];
	return outstream;
}

⌨️ 快捷键说明

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