問題描述:給定兩個正整數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;
}