高精度运算是指对超出基本数据类型范围的大整数进行运算(例如超过long
范围的整数)。在Java中,可以通过字符串或数组来表示大整数,并手动实现加法、减法、乘法和除法。以下是这些高精度运算的实现及使用示例:
1. 高精度加法
实现思路:
- 从低位到高位逐位相加,记录进位。
- 将结果存储在字符串或数组中。
代码实现:
public class HighPrecisionAddition {public static String add(String num1, String num2) {StringBuilder result = new StringBuilder();int carry = 0;int i = num1.length() - 1;int j = num2.length() - 1;while (i >= 0 || j >= 0 || carry > 0) {int digit1 = (i >= 0) ? num1.charAt(i--) - '0' : 0;int digit2 = (j >= 0) ? num2.charAt(j--) - '0' : 0;int sum = digit1 + digit2 + carry;result.append(sum % 10);carry = sum / 10;}return result.reverse().toString();}public static void main(String[] args) {String num1 = "12345678901234567890";String num2 = "98765432109876543210";System.out.println("Sum: " + add(num1, num2));}
}
2. 高精度减法
实现思路:
- 从低位到高位逐位相减,记录借位。
- 如果被减数小于减数,交换两数并在结果前加负号。
代码实现:
public class HighPrecisionSubtraction {public static String subtract(String num1, String num2) {if (compare(num1, num2) < 0) {return "-" + subtract(num2, num1);}StringBuilder result = new StringBuilder();int borrow = 0;int i = num1.length() - 1;int j = num2.length() - 1;while (i >= 0 || j >= 0) {int digit1 = (i >= 0) ? num1.charAt(i--) - '0' : 0;int digit2 = (j >= 0) ? num2.charAt(j--) - '0' : 0;int diff = digit1 - digit2 - borrow;if (diff < 0) {diff += 10;borrow = 1;} else {borrow = 0;}result.append(diff);}// 移除前导零while (result.length() > 1 && result.charAt(result.length() - 1) == '0') {result.deleteCharAt(result.length() - 1);}return result.reverse().toString();}private static int compare(String num1, String num2) {if (num1.length() != num2.length()) {return num1.length() - num2.length();}return num1.compareTo(num2);}public static void main(String[] args) {String num1 = "12345678901234567890";String num2 = "98765432109876543210";System.out.println("Difference: " + subtract(num1, num2));}
}
3. 高精度乘法
实现思路:
- 模拟手工乘法,逐位相乘并累加结果。
- 使用数组存储中间结果。
代码实现:
public class HighPrecisionMultiplication {public static String multiply(String num1, String num2) {int[] result = new int[num1.length() + num2.length()];for (int i = num1.length() - 1; i >= 0; i--) {for (int j = num2.length() - 1; j >= 0; j--) {int product = (num1.charAt(i) - '0') * (num2.charAt(j) - '0');int sum = product + result[i + j + 1];result[i + j + 1] = sum % 10;result[i + j] += sum / 10;}}StringBuilder sb = new StringBuilder();for (int digit : result) {if (!(sb.length() == 0 && digit == 0)) {sb.append(digit);}}return sb.length() == 0 ? "0" : sb.toString();}public static void main(String[] args) {String num1 = "123456789";String num2 = "987654321";System.out.println("Product: " + multiply(num1, num2));}
}
4. 高精度除法
实现思路:
- 模拟手工除法,逐位计算商和余数。
- 使用字符串存储结果。
代码实现:
public class HighPrecisionDivision {public static String divide(String num1, String num2) {if (num2.equals("0")) {throw new ArithmeticException("Division by zero");}StringBuilder result = new StringBuilder();int index = 0;int temp = num1.charAt(index) - '0';while (temp < Integer.parseInt(num2)) {temp = temp * 10 + (num1.charAt(++index) - '0');}while (index < num1.length()) {result.append(temp / Integer.parseInt(num2));temp = (temp % Integer.parseInt(num2)) * 10 + (++index < num1.length() ? num1.charAt(index) - '0' : 0);}return result.length() == 0 ? "0" : result.toString();}public static void main(String[] args) {String num1 = "12345678901234567890";String num2 = "12345";System.out.println("Quotient: " + divide(num1, num2));}
}
5. 使用场景
- 大整数运算:
- 例如密码学、大数计算、科学计算等领域。
- 竞赛编程:
- 在算法竞赛中,高精度运算常用于处理大整数问题。
- 金融计算:
- 例如高精度货币计算、利率计算等。
6. 总结
运算 | 实现思路 | 时间复杂度 | 空间复杂度 |
---|---|---|---|
加法 | 逐位相加,处理进位 | O(max(M, N)) | O(max(M, N)) |
减法 | 逐位相减,处理借位 | O(max(M, N)) | O(max(M, N)) |
乘法 | 逐位相乘,累加结果 | O(M * N) | O(M + N) |
除法 | 逐位计算商和余数 | O(M) | O(M) |
高精度运算的核心思想是模拟手工计算过程,通过字符串或数组存储大整数,并逐位处理进位、借位等问题。这些算法在解决大整数问题时非常有用。