今天晚上突然想到这个大整数的乘法和加法还没有通过自己的验证,所以尽快地写了一个程序。其中遇到的问题有很多。
1. 在每次做数组的转换时,要考虑顺序,先加到后一位,再求余
2. char转化为int类型的时候要减去0的assic码
3. 最后一个问题就是到底结果有多少位,加法的位数最多为最长整数的位数加一;乘法的位数最多是两个整数位数相加。
4. 另外一点char *a="9876",这是一个字符常量,最好在前面加一个const。
5. 动态数组在创建时内置类型是没有初始化的, 所以如果不初始化将产生不可预料的错误。在创建时一定要初始化。
#include <iostream>
using namespace std;
void transform(int *a, int length){
for (int i = 0; i < length; ++i){
a[i+1] += a[i]/10;
a[i] %= 10;//考虑顺序,先加到后一位,然后再求余
}
}
int *bigmultiple(const char *a, int a_length, const char *b, int b_length){
int *c = new int[a_length + b_length + 1]();
for (int i = 0; i < b_length; ++i){
for (int j = 0; j < a_length; ++j){
c[i+j] += (a[j]-'0') * (b[i]-'0');
}
transform(c,i+a_length+1);
}
return c;
}
int *bigadd(const char *a, int a_length, const char *b, int b_length,
int &length){
int max = a_length>b_length?a_length+1:b_length+1;
int *c = new int[max]();
int i = 0, j=0;
while (i < a_length && j < b_length){
c[i] = a[i] - '0' + b[i] - '0';
i++;
j++;
}
if (i < a_length){
while (i < a_length){
c[i] += a[i]-'0';
i++;
}
}
else {
while (j < b_length){
c[j] += b[j]-'0';
j++;
}
}
transform(c, max);
length = max;
return c;
}
int main(){
const char *a = "12345678901234567890123456789";
int a_length = 29;
const char *b = "012345678909876543210123456789";
int b_length = 30;
int *c;
/*
c = bigmultiple(a, a_length, b, b_length);
for (int i = a_length+b_length-1; i >= 0; --i){
cout << c[i];
}//输出可能出现问题,不使用此方法输出
cout << endl;
int d[] = {12, 34, 56, 78, 32, 34, 35, 35};
transform(d, 8);
for (int i = 0; i < 8; ++i)
cout << d[i];
*/
int length;
c = bigadd(a, a_length, b, b_length, length);
输出
for (int i = 0; i < length; ++i){
cout << c[i];
}//这样输出可能会出现问题
可以这样输出
int i = length;
while (a[length==0)
--i;
while (i >= 0)
cout << c[i];
cout << endl;
delete []c;
return 0;
}
计算98765432109876543210987654321×987654321012345678909876543210
的结果,答案是这样的:
97546105789971040991098917846802316719900015241577899710410
97546105789971040991098917846802316719900015241577899710410