使用字符串实现大整数加法,这里使用固定大小的210长度的字符串,两个初始化的构造函数
CHugeInt(char str[]) {
memset(num, 0, sizeof(num));
strcpy(num, str);
Reverse(num);
}
CHugeInt(int n) {
memset(num, 0, sizeof(num));
sprintf(num, "%d", n); // 整数转化为字符串
Reverse(num);
}
这里需要注意的地方是需要用memset对字符串进行初始化,这样可以便于后面加法算法的执行。将整形转化字符串可以使用C语言函数sprintf,另外,字符串的顺序和我们熟悉的竖式加法的顺序是相反的,需要进行反转。
private:
char num[210];
void Reverse(char str[]) {
int left = 0;
int right = strlen(str) - 1;
while (left < right) {
swap(str[left], str[right]);
left++;
right--;
}
}
最后输出的时候需要一位数一位数的反向输出
friend ostream & operator<<(ostream &os ,const CHugeInt &a) { // 这里第二参数必须有const
// 逆序输出
int n = strlen(a.num) - 1;
for (int i = n; i >= 0; i--)
os << a.num[i];
return os;
}
核心的加法算法代码就一个
CHugeInt operator+(CHugeInt const & a) const // 两个const不是必要的
{
CHugeInt temp(0); // 这里不能改变第一个数的值,所有返回temp
int carry = 0; // 进位
for (int i = 0; i < 210; i++)
{
char c1 = num[i];
char c2 = a.num[i];
if (c1 == 0 && c2 == 0 && carry == 0)
break; // 到前面0位的情况
if (c1 == 0)
c1 = '0';
if (c2 == 0)
c2 = '0';
int k = c1 - '0' + c2 - '0' + carry;
if (k >= 10)
{
carry = 1;
temp.num[i] = k - 10 + '0';
}
else
{
carry = 0;
temp.num[i] = k + '0';
}
}
return temp;
}
两个扩展的函数
CHugeInt operator +(int n) {
return *this + CHugeInt(n);
}
friend CHugeInt operator+(int n, CHugeInt &b) {
return CHugeInt(n) + b;
}
CHugeInt& operator+=(int n) {
*this = *this + n;
return *this;
}
要特别注意++b单目运算符
// ++b
CHugeInt & operator++() {
*this = *this + 1;
return *this;
}
和b++重载
CHugeInt operator++(int){ // b++
CHugeInt temp(*this);
*this = *this + 1;
return temp;
}