- 解决存储的问题
可以用C++中的vector来存需要操作的数据,存数据的时候采用倒序的方式,这样的效率更高。产生的进位可以直接跟在后面而不用移动数据 也可以使用自己定义的顺序表seqlist类。
- 解析一下seqlis类的成员以及函数
1.构造函数
2. 析构函数
3. 尾插方法
4. 头插方法
5. 插入方法、插入的变种方法
6. 删除方法、删除的变种方法
7. 顺序表的大小方法
8. 顺序表的容量方法
9. 重载方括号[ ]
10. 清除方法
11. 判空,判满方法
12. 增长空间的函数(当容量不够的时候,扩容)
13. 私有成员:指针、容量、大小
- util.h文件
包含一些常见的头文件,以及出错的处理。
- BigInt类的解析
私有的成员变量是一个seqlist的实例,还有好多的方法。
loaddata方法,随机加载随机数用于测试
showdata方法,用来显示顺序表中的数据,从后往前
- 加法实现的细节
u_char BigInt::AddItem(u_char a, u_char b, u_char &sign)
{
u_char sum = a + b + sign;
if(sum >= 10)
{
sum -= 10;
sign = 1;
}
else
sign = 0;
return sum;
}
void BigInt::Add(BigInt &bt, const BigInt &bt1, const BigInt &bt2)
{
u_long i, j;
i = j = 1;
u_char sum = 0, sign = 0;
while(i<=bt1.size() && j<=bt2.size())
{
sum = AddItem(bt1[i], bt2[j], sign);
bt.push_back(sum);
i++;
j++;
}
while(i <= bt1.size())
{
sum = AddItem(bt1[i], 0, sign);
bt.push_back(sum);
i++;
}
while(j <= bt2.size())
{
sum = AddItem(0, bt2[j], sign);
bt.push_back(sum);
j++;
}
if(sign > 0)
bt.push_back(sign);
}
u_char BigInt::SubItem(u_char a, u_char b, u_char &sign)
{
u_char sub;
if(a >= b + sign)
{
sub = a - b - sign;
sign = 0;
}
else
{
sub = a+10 - b - sign;
sign = 1;
}
return sub;
}
void BigInt::Sub(BigInt &bt, const BigInt &bt1, const BigInt &bt2)
{
assert(bt1 >= bt2);
u_long i, j;
i = j = 1;
u_char sub, sign = 0;
while(i<=bt1.size() && j<=bt2.size())
{
sub = SubItem(bt1[i], bt2[j], sign);
bt.push_back(sub);
i++;
j++;
}
while(i<=bt1.size())
{
sub = SubItem(bt1[i], 0, sign);
bt.push_back(sub);
i++;
}
}
void BigInt::MulItem(BigInt &bt, const BigInt &bt1, const u_char &x)
{
u_long i = 1;
u_char mul, sign=0;
while(i <= bt1.size())
{
mul = bt1[i] * x + sign;
sign = mul / 10;
mul %= 10;
bt.push_back(mul);
i++;
}
if(sign > 0)
bt.push_back(sign);
}
void BigInt::AddMove(BigInt &bt, const BigInt &bt1, u_long pos)
{
u_long i = pos;
u_long j = 1;
u_char sign = 0;
while(i<=bt.size() && j<=bt1.size())
{
bt[i] = AddItem(bt[i], bt1[j], sign);
i++;
j++;
}
while(sign>0 && i<=bt.size())
{
bt[i] = AddItem(bt[i], 0, sign);
i++;
}
while(j <= bt1.size())
{
u_char sum = AddItem(0, bt1[j], sign);
bt.push_back(sum);
j++;
}
if(sign > 0)
bt.push_back(sign);
}
void BigInt::Mul(BigInt &bt, const BigInt &bt1, const BigInt &bt2)
{
BigInt tmp;
for(u_long i=1; i<=bt2.size(); ++i)
{
tmp.clear();
MulItem(tmp, bt1, bt2[i]);
AddMove(bt, tmp, i);
}
}
void BigInt::Div(BigInt &bt, const BigInt &bt1, const BigInt &bt2)
{
bt.clear();
BigInt btd;
btd.clear();
u_long k = bt2.size();
u_long i = bt1.size() - bt2.size();
while(k-- > 0)
{
btd.push_back(bt1[i+1]);
i++;
}
int n = bt1.size() - bt2.size();
u_char div = 0;
while(n >= 0)
{
while(btd >= bt2)
{
btd -= bt2;
div++;
}
bt.push_front(div);
if(n > 0)
btd.push_front(bt1[n]);
n--;
div = 0;
}
clear_head_zero(bt);
}