返回
算法基础(二)| 带你走进高精度算法的殿堂
后端
2023-10-27 05:37:03
高精度算法在我们的日常生活中有着广泛的应用,例如:
- 密码学:高精度算法用于生成和验证密码。
- 金融:高精度算法用于计算利息和汇率。
- 科学计算:高精度算法用于模拟物理和化学过程。
- 图形学:高精度算法用于生成逼真的图像和动画。
在本文中,我们将详细介绍高精度算法的原理和实现。我们将从高精度加法开始,然后依次介绍高精度减法、高精度乘法和高精度除法。
高精度加法
高精度加法是高精度算法中最基本的操作。高精度加法的原理很简单,就是将两个大整数逐位相加,并将进位记入下一位。高精度加法的实现也很简单,我们可以使用一个循环来逐位相加,并使用一个变量来记录进位。
public static String add(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
int maxLen = Math.max(len1, len2);
int[] a = new int[maxLen + 1];
int[] b = new int[maxLen + 1];
for (int i = 0; i < len1; i++) {
a[i] = num1.charAt(len1 - 1 - i) - '0';
}
for (int i = 0; i < len2; i++) {
b[i] = num2.charAt(len2 - 1 - i) - '0';
}
int carry = 0;
for (int i = 0; i < maxLen + 1; i++) {
int sum = a[i] + b[i] + carry;
a[i] = sum % 10;
carry = sum / 10;
}
StringBuilder sb = new StringBuilder();
for (int i = maxLen; i >= 0; i--) {
if (i == 0 && a[i] == 0) {
continue;
}
sb.append(a[i]);
}
return sb.toString();
}
高精度减法
高精度减法与高精度加法类似,原理也很简单,就是将两个大整数逐位相减,并将借位记入下一位。高精度减法的实现也与高精度加法类似,我们可以使用一个循环来逐位相减,并使用一个变量来记录借位。
public static String subtract(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
int maxLen = Math.max(len1, len2);
int[] a = new int[maxLen + 1];
int[] b = new int[maxLen + 1];
for (int i = 0; i < len1; i++) {
a[i] = num1.charAt(len1 - 1 - i) - '0';
}
for (int i = 0; i < len2; i++) {
b[i] = num2.charAt(len2 - 1 - i) - '0';
}
int borrow = 0;
for (int i = 0; i < maxLen + 1; i++) {
int diff = a[i] - b[i] - borrow;
if (diff < 0) {
diff += 10;
borrow = 1;
} else {
borrow = 0;
}
a[i] = diff;
}
StringBuilder sb = new StringBuilder();
for (int i = maxLen; i >= 0; i--) {
if (i == 0 && a[i] == 0) {
continue;
}
sb.append(a[i]);
}
return sb.toString();
}
高精度乘法
高精度乘法是高精度算法中相对复杂的操作。高精度乘法的原理是将两个大整数逐位相乘,并将进位记入下一位。高精度乘法的实现也相对复杂,我们可以使用一个循环来逐位相乘,并使用一个变量来记录进位。
public static String multiply(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
int[] a = new int[len1 + len2];
for (int i = 0; i < len1; i++) {
int n1 = num1.charAt(len1 - 1 - i) - '0';
for (int j = 0; j < len2; j++) {
int n2 = num2.charAt(len2 - 1 - j) - '0';
int product = n1 * n2;
a[i + j] += product % 10;
a[i + j + 1] += product / 10;
}
}
int carry = 0;
for (int i = 0; i < len1 + len2; i++) {
int sum = a[i] + carry;
a[i] = sum % 10;
carry = sum / 10;
}
StringBuilder sb = new StringBuilder();
for (int i = len1 + len2 - 1; i >= 0; i--) {
if (i == 0 && a[i] == 0) {
continue;
}
sb.append(a[i]);
}
return sb.toString();
}
高精度除法
高精度除法是高精度算法中最复杂的操作。高精度除法的原理是将被除数逐位除以除数,并将余数记入下一位。高精度除法的实现也相对复杂,我们可以使用一个循环来逐位除以除数,并使用一个变量来记录余数。
public static String divide(String num1, String num2) {
int len1 = num1.length();
int len2 = num2.length();
if (len1 < len2) {
return "0";
}
int[] a = new int[len1 + 1];
int[] b = new int[len2 + 1];
for (int i = 0; i < len1; i++) {
a[i] = num1.charAt(len1 - 1 - i) - '0';
}
for (int i = 0; i < len2; i++) {
b[i] = num2.charAt(len2 - 1 - i) - '0';
}
int[] q = new int[len1 - len2 + 1];
int r = 0;
for (int i = len1 - len2; i >= 0; i--) {
int n1 = a[i + len2] + r * 10;
int n2 = b[len2 - 1];
int q