大数相乘
大数相乘的方法很多,在这里我就介绍一个理解和写起来比较方便的
思想和大数相加差不多!!!
为什么大数相乘相较于大数相加比较难呢?(以 n × m 位的数为例)
- 加法只需要遍历一次, 而乘法则需要遍历 m 次或者 n 次
- 乘法的进位比较麻烦
假设两个大数的字符数组分别为 s1, s2 ,答案数组为 a[]
遍历是比较简单的,主要是进位的问题,我们可以先不考虑进位,将 s1 的第 i 位与 s2 的第 j 位相乘的数放在 a 数组的第 i + j - 1位
即我们在运算的时候是不考虑进位的
void BigNumMul(char * s1, char * s2){
int a[100] = {0};
int i = strlen(s1) - 1, j = strlen(s2) - 1; // 从后往前处理
while(i >= 0){
while(j >= 0){
a[i + j + 2] += (s1[i] - '0') * (s2[j] - '0');
j--;
}
i--;
j = strlen(s2) - 1;
}
int n = strlen(s1) + strlen(s2), temp = 0;
// 处理运算完成的数组
for(i = n; i > 2; --i){
int temp1 = a[i] + temp;
a[i] = temp1 % 10;
temp = temp1 / 10;
}
a[2] += temp; // a[2] 为第一个数,不需要处理
for(i = 2; i <= n; ++i){
printf("%d", a[i]);
}
}
写起来比较方便的