一、问题的思考
1、对于大整数,我们只需要提供构造,显示,加减法,乘法,除法,模除,指数这些用户接口就可以了。
2、符号位怎么解决?首先考虑的办法是定义一个类,然后里面有sign_, std::vector<char> i_这两个成员变量,我在实现的过程中发现这样写代码,思路不够清晰,代码也不好写。因为当我们编写代码实现加减乘除,比较运算的时候,就不得不考虑符号位,这种设计会使代码的逻辑复杂,不够清晰。
3、正确的办法是先编写一个UnsignedInteger类实现所有的运算,然后再实现有符号的大整数运算。
4、如何实现无符号大整数加减乘除(减法只支持大减小)。加减都很简单,乘法只需提供基本UnsignedInteger * (0--9),UnsignedInteger * (10 ^K),然后利用加法运算,就可以实现乘法。除法则需要利用UnsignedInteger * (0--9),UnsignedInteger * (10 ^K),比较运算,减法运算,就可以实现除法。
5、无符号大整数的存储采用std::vector<char>,每一个char表示一个十进制位,并且第一个char表示最低位,最后一个char表示最高位
1、无符号整数的基础运算
代码如下:
#include <iostream>
#include <vector>
#include <assert.h>
#include <cmath>
#include <utility>
class UnsignBigInteger {
private:
std::vector< char > i_;
void compact() {
int count = 0;
for( int i = i_.size() - 1; i >= 0; i-- )
if( i_[i] == 0 )
count++;
else
break;
//resize dose not change storage capacity directly
i_.resize( i_.size() - count );
}
void expand10( int k ) {
int curSize = i_.size();
int expandSize = curSize + k;
i_.resize( expandSize, 0 );
copy_backward( i_.begin(), i_.begin() + curSize,
i_.end() );
fill_n( i_.begin(), k, 0 );
}
void add( const UnsignBigInteger &other ) {
int max = std::max( i_.size(), other.i_.size() );
//to reserve one more place, so it is enough to hold sum
i_.resize( max + 1, 0 );
int c = 0;
for( unsigned i = 0; i < i_.size(); i++ ) {
int value = i_[i] + c ;
if( i < other.i_.size() )
value += other.i_[i];
i_[i] = value % 10;
c = value / 10;
}
}
void sub( const UnsignBigInteger &o ) {
i