- 模擬手算
- 先不管所有進位計算,最后統一處理進位
乘積的位數最大為兩個相乘數的位數和,所以開始就可給定結果的位數。用result來表示每次相乘的和。
具體代碼:
char * Mul(char * a, char * b)
{
char * result=(char *)malloc(strlen(a)+strlen(b), '0'); //兩個數相乘,結果的位數不會超過它們的位數之和。
memset(result, '0', strlen(a)+strlen(b));
for (int i = b.length() - 1; i >= 0; --i)
{
int mul_carry = 0, add_carry = 0; //記錄乘法時的進位,加法時的進位
for (int j = a.length() - 1; j >= 0; --j)
{
int temp = (b[i] - '0') * (a[j] - '0') + mul_carry; //每位相乘的值
mul_carry = temp / 10; //記錄進位
temp %= 10; //進位后的值
int temp2 = result[i + j + 1] - '0' + temp + add_carry;
result[i + j + 1] = temp2 % 10 + 48; //設置相應位上的值和原本位上值相加后的值。
add_carry = temp2 / 10; //記錄進位
}
result[i] += mul_carry + add_carry;
}
//如果首位是0,則從第二位開始輸出
if (result[0] == '0')
result = result.substr(1, result.length());
return result;
}