我已经开始编写一个bignum库,带有一个短裤矢量来表示值,打印功能和负数支持。但是,我找不到实现长时间添加的好方法,如下所示:
123
+123
----
246
我有的最新代码没有给出段错误:
void add(unsigned long long b)
{
for(long long i=v.size()-1;i>=0;--i)
{
if((b+v[i])<10)
v[i]+=b;
else // Carry
{
if(i==0) // 1st digit
{
v.push_front(1); // Can't be more than 1
}
else
v[i-1]++; // Increment digit to the left
}
}
}
,但添加携带不正确(10 + 1为21)
编辑:它是作为一个类实现的
答案 0 :(得分:0)
考虑将11传递给函数:
如果vector[i]
&gt; = 0,则b+vector[i]
&gt; 11,因此b+vector[i]<10
永远不会成真。
其他一些事情:
您正在使用vector
和v
,我很确定只应该有一个。
i>0
应为i>=0
,否则循环会跳过第一个元素。
让每个元素代表一个数字有点矫枉过正。您可以让每个元素代表0-65535(无符号短整数范围)。只需在下面更改10到65535。或者0-10000也可能有意义,因为分解成数字会更简单。
该函数不应该包含BigNum类的参数吗?
从第一个到最后一个元素的循环会更有意义。
更好的(未经测试的)add
函数可能如下所示:
const int BASE = 10;
void add(unsigned long long b)
{
for (int i = 0; b > 0 && i < v.size(); ++i)
{
unsigned long long val = b + v[i];
b = val / BASE;
v[i] = val % BASE;
}
// if adding more digits
while (b > 0)
{
v.push_back(b % BASE);
b /= BASE;
}
}