标签:
正整数的高精度加法和高精度乘法(C++)
加法运算如下:
// 高精度加法 string add(string a, string b) { // 确保 a >= b if (a.size() < b.size()) { string temp = a; a = b; b = temp; } int len1 = a.size(), len2 = b.size(); // a, b前缀补零 ,比如 a = 12345, b = 678时,补零之后 a = 012345,b = 0000678. a = ‘0‘ + a; for (int i = 0; i <= len1-len2; i++) b = "0" + b; string sum; for (int i = 0; i <= len1; i++) sum += ‘0‘; int c = 0; // 进位 for (int i = len1; i >= 0; i--) { int t = (a[i] - ‘0‘)+(b[i] - ‘0‘) + c; sum[i] += t%10; c = t/10; } // 若最高位进位为0, 则去掉最高位 if (sum[0] == ‘0‘) sum = sum.substr(1, sum.size()); return sum; }
乘法运算建立在加法运算之上,乘法的主要思想是把乘法转化为加法进行运算。
请先看下面的等式:
12345*4=12345+12345+12345+12345
12345*20=123450*2
12345*24=12345*20+12345*4
等式(1)说明,多位数乘一位数,可以直接使用加法完成。
等式(2)说明,多位数乘形如d*10n的数,可以转换成多位数乘一位数来处理。
等式(3)说明,多位数乘多位数,可以转换为若干个“多位数乘形如d*10n的数与多位数乘一位数”之和。
因此,多位数乘多位数最终可以全部用加法来实现。
实现代码如下:
// 高精度乘法 :利用高精度加法实现 string multi(string a, string b) { if (a.size() < b.size()) { string temp = a; a = b; b = temp; } int len1 = a.size(), len2 = b.size(); string product = "0"; for (int i = len2-1; i >= 0; i--) { if (i < len2-1) a += "0"; string temp = a; if (b[i] == ‘0‘) temp = "0"; else for (int k = 1; k < b[i]-‘0‘; k++) temp = add(temp, a); product = add(product, temp); } return product; }
减法和除法待续......
标签:
原文地址:http://www.cnblogs.com/Jay-Wong/p/5066865.html