一、高精度算法概述
在C++编程中,int
型(-2147483648 ~ 2147483647)和long long
型(-9223372036854775808~9223372036854775807)的数值范围有限。当处理超过19位的整数(如30位或200位的数字)时,常规数据类型无法存储,必须采用字符串输入+数组存储的方式处理,这种技术称为高精度算法。
二、高精度加法实现
核心步骤:
-
字符串转数字数组并逆序存储(低位对齐)
-
逐位相加并处理进位
-
去除前导零并输出结果
string A, B; int a[40] = {0}, b[40] = {0}, sum[40] = {0}; cin >> A >> B; // 输入样例:1234567890314 5890235578899// 字符串逆序转数字数组 int lenA = A.length(); for (int i = 0; i < lenA; i++) {a[lenA - i - 1] = A[i] - '0'; } int lenB = B.length(); for (int i = 0; i < lenB; i++) {b[lenB - i - 1] = B[i] - '0'; }// 逐位相加 int c = 0, lenS = 0; // 进位、结果长度 while (lenS < lenA || lenS < lenB) {sum[lenS] = (a[lenS] + b[lenS] + c) % 10;c = (a[lenS] + b[lenS] + c) / 10;lenS++; } sum[lenS] = c; // 处理最高位进位// 输出结果(去除前导零) if (c == 0) lenS--; for (int i = lenS; i >= 0; i--) {cout << sum[i]; // 输出样例:1234573469213 }
三、高精度减法实现
核心步骤:
-
比较大小确定符号
-
逆序存储并处理借位
-
去除前导零并输出符号
string A, B; int a[200] = {0}, b[200] = {0}, sub[200] = {0}; cin >> A >> B; // 输入样例:9999999999 9999999999999999999988// 比较大小确定符号 int sign = 1; if (A.length() < B.length() || (A.length() == B.length() && A < B)) {sign = -1;swap(A, B); }// 逆序转数组 int lenA = A.length(); for (int i = 0; i < lenA; i++) {a[lenA - i - 1] = A[i] - '0'; } int lenB = B.length(); for (int i = 0; i < lenB; i++) {b[lenB - i - 1] = B[i] - '0'; }// 逐位相减 int lenS = 0; while (lenS < lenA || lenS < lenB) {if (a[lenS] < b[lenS]) {a[lenS] += 10;a[lenS + 1]--;}sub[lenS] = a[lenS] - b[lenS];lenS++; }// 输出结果 if (sign == -1) cout << '-'; while (lenS > 0 && sub[lenS] == 0) lenS--; // 去除前导零 for (int i = lenS; i >= 0; i--) {cout << sub[i]; // 输出样例:-9999999999989999999989 }
四、高精度乘法实现
核心步骤:
-
双循环逐位相乘
-
累加结果并处理进位
-
去除前导零
string A, B; int a[104] = {0}, b[104] = {0}, m[204] = {0}; cin >> A >> B; // 输入样例:864 132// 逆序转数组 int lenA = A.length(); for (int i = 0; i < lenA; i++) {a[lenA - i - 1] = A[i] - '0'; } int lenB = B.length(); for (int i = 0; i < lenB; i++) {b[lenB - i - 1] = B[i] - '0'; }// 逐位相乘累加 for (int j = 0; j < lenB; j++) {int c = 0; // 进位for (int i = 0; i < lenA; i++) {m[i + j] += a[i] * b[j] + c;c = m[i + j] / 10;m[i + j] %= 10;}m[j + lenA] = c; // 处理最高位进位 }// 输出结果 int len = lenA + lenB; while (len > 0 && m[len] == 0) len--; // 去除前导零 for (int i = len; i >= 0; i--) {cout << m[i]; // 输出样例:114048 }
五、算法总结
运算类型 | 关键处理 | 时间复杂度 |
---|---|---|
加法 | 进位处理、逆序对齐 | O(n) |
减法 | 借位处理、符号判断 | O(n) |
乘法 | 双重循环累加 | O(n²) |
掌握高精度算法后,可处理任意长度整数运算,适用于密码学、大数据分析等领域。实际开发中需注意内存分配优化和运算效率提升。