问题描述:给定两个正整数A,B(A和B可能超出计算机中国INT32,INT64的范围,高达几百甚至上千位),
求A和B相乘的积。
解决方案:
用计算机模拟手算的乘法,假设A和B都用字符串表示,
时间复杂度为:O(strlen(A) * strlen(B)) ;
空间复杂度为:O(strlen(A) + strlen(B)) ;
源码实现如下:
#include
#include
#include
//大整数的乘法
//时间复杂度O(strlen(a) * strlen(b))
//空间复杂度O(strlen(a) + strlen(b))
//a,b都是用字符串表示的正的整数
//例如:a=12345678910, b=10987654321
char* mul(const char *a, const char *b)
{
//略去对大整数a,b的合法性判断
int len1 = strlen(a);
int len2 = strlen(b);
int len = len1 + len2;
int i,j,k;
int *c = (int*)malloc(sizeof(int) * (len - 1));
memset(c, 0, sizeof(int) * (len - 1));
//[PS:一个数字减去'0'就是它对应的数值]
//模拟手算乘法
for(i = 0; i < len1; ++i)
for(j = 0; j < len2; ++j)
c[i + j] += (a[i] - '0') * (b[j] - '0');
char* r = (char*)malloc(sizeof(char) * (len + 1));
memset(r, 0, sizeof(char) * (len + 1));
int carry = 0;
//按从低位到高位的顺序将每一位的结果存到r中
for(i = len - 2, k = 0; i >= 0; --i, k++)
{
r[k] = (c[i] + carry) % 10 + '0';
carry = (c[i] + carry) / 10;
}
if(carry) r[k++] = carry + '0';
//将结果r倒置
for(i = 0, j = k - 1; i < j; i++,j--)
{
int tmp = r[i];
r[i] = r[j];
r[j] = tmp;
}
free(c);
return r;
}
int main()
{
const char* a = "12345678910";
const char* b = "10987654321";
char * r = mul(a, b);
printf("%s\n", r);
free(r);
system("pause");
return 0;
}
|