C++ C+中的幂非常大+;
有没有人能给我一点时间,他能向我解释一下,有多大的数字?我这里不是说一个现成的解决方案,也不是对如何实现算法的唯一解释。理想情况下,它基于类std::string @编辑C++ C+中的幂非常大+;,c++,string,math,C++,String,Math,有没有人能给我一点时间,他能向我解释一下,有多大的数字?我这里不是说一个现成的解决方案,也不是对如何实现算法的唯一解释。理想情况下,它基于类std::string @编辑 我读了一些关于移位位的内容,但是示例只是以列表的形式出现的,我想解释一下它是如何工作的。您可以将一个大数字表示为某个基数中的一系列数字,并分别表示数字的符号。要做算术,你只需实现你在小学学过的算法,做加法、长乘法等。有更有效的算法(例如Karatsuba)做一些运算,但最初的实现可以使用更简单的形式 如果确实必须使用std::
我读了一些关于移位位的内容,但是示例只是以列表的形式出现的,我想解释一下它是如何工作的。您可以将一个大数字表示为某个基数中的一系列数字,并分别表示数字的符号。要做算术,你只需实现你在小学学过的算法,做加法、长乘法等。有更有效的算法(例如Karatsuba)做一些运算,但最初的实现可以使用更简单的形式
如果确实必须使用std::string,则可以使用第一个字符存储符号(“+”或“-”),然后使用ascii存储以10为底的数字。虽然效率不高,但这可能是一种简单的开始方式,而且它确实使打印数字变得容易。以下是我在需要时(不记得什么时候)快速编写的内容。它是:
typedef long long int lli;
class BigInt
{
public: // Methods
BigInt(lli s) : m_nbElements(100)
{
m_number.resize(m_nbElements);
for (lli i=0; i < m_nbElements; ++i)
{
m_number[i] = s%1000;
s /= 1000;
}
}
BigInt(const std::string &str) : m_nbElements(100)
{
m_number.resize(m_nbElements);
size_t sizeStr = str.size();
int i = str.size() - 1;
int thousands = 0;
for (; i >= 2; i -= 3, ++thousands)
{
std::string subStr = str.substr(i-2, 3);
unsigned int value;
std::istringstream(subStr) >> value;
m_number[thousands] = value;
}
// Handle the "first" 1 or 2 digits
if (i >= 0)
{
std::string subStr = str.substr(0, i+1);
unsigned int value;
std::istringstream(subStr) >> value;
m_number[thousands] = value;
}
}
BigInt operator*(lli s)
{
lli temp, remainder = 0;
for (lli i=0; i < m_nbElements; ++i)
{
temp = m_number[i] * s + remainder;
m_number[i] = temp % 1000;
remainder = temp / 1000;
}
return (*this);
}
BigInt operator/(lli s)
{
lli temp, remainder = 0;
for (int i=m_nbElements-1; i >= 0; --i)
{
temp = (m_number[i] + remainder) / s;
remainder = (m_number[i] % s)*1000;
m_number[i] = temp;
}
return (*this);
}
BigInt operator-(BigInt s)
{
lli temp;
for (unsigned int i=0; i < m_nbElements; ++i)
{
temp = m_number[i] - s.m_number[i];
if (temp < 0)
{
--m_number[i+1];
temp += 1000;
}
m_number[i] = temp;
}
return (*this);
}
BigInt operator+(BigInt s)
{
lli temp, remainder = 0;
for (lli i=0; i < m_nbElements; ++i)
{
temp = m_number[i] + s.m_number[i] + remainder;
m_number[i] = temp % 1000;
remainder = temp / 1000;
}
return (*this);
}
std::string ToString()
{
std::string result = "";
bool significantDigitsFound = false;
for (int i=m_nbElements-1; i >= 0 ; --i)
{
if (!significantDigitsFound)
{
if (m_number[i] > 0)
{
std::ostringstream ss;
ss << m_number[i];
result = ss.str();
significantDigitsFound = true;
}
}
else
{
std::ostringstream ss;
ss << std::setw(3) << std::setfill( '0' ) << m_number[i];
result += ss.str();
}
}
if (result == "")
{
result = "0";
}
return result;
}
private: // Attributes
int m_nbElements;
std::vector<lli> m_number;
};
typedef long long int lli;
类BigInt
{
公共方法
BigInt(lli s):m_n元素(100)
{
m_编号。调整大小(m_元素);
对于(lli i=0;i=2;i-=3,++1000)
{
std::string subStr=str.subStr(i-2,3);
无符号整数值;
std::istringstream(subStr)>>值;
m_数【千】=数值;
}
//处理“第一个”1或2位数字
如果(i>=0)
{
std::string subStr=str.subStr(0,i+1);
无符号整数值;
std::istringstream(subStr)>>值;
m_数【千】=数值;
}
}
BigInt运算符*(lli s)
{
lli温度,余数=0;
对于(lli i=0;i=0;--i)
{
温度=(m_编号[i]+余数)/s;
余数=(m_数[i]%s)*1000;
m_编号[i]=温度;
}
返回(*本条);
}
BigInt运算符-(BigInt s)
{
lli温度;
for(无符号整数i=0;i=0;--i)
{
如果(!找到有效数字)
{
如果(m_编号[i]>0)
{
std::ostringstream ss;
ss搜索大整数库。然而,实际上没有解决方案将基于std::string,因为这是低效的。编写您自己的,或将每个数字字符串化。您必须将数字声明为数组…数组的每个元素指向一位数字如果您正计划实现我们自己的(你可能会发疯,因为已经有很多实现了)我鼓励你对你的数据类型使用一个常规的定标器向量,并编写转换器来转换到std::string
。当你不需要经常做,你会发现数学部分更容易合并(arg[n]-“0”)
用于每个数据。生成的代码将更易于维护。使用std::string
您可以完全按照在学校学到的方法进行算术运算。一次一位数。除法是最难的,但在计算幂时不需要除法。这是学习bignum算术(以及解释器如何工作)的一种非常愉快的方式是从emptyspace学习Scheme 9。这本书不是免费的,但很便宜。请看。它很有趣。bignum实现牺牲了一点速度来实现非常简洁、易懂的实现。当您理解这一点时,像gnump
这样更复杂的包将更容易找到。