一、高精度算法概述
在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²) |
掌握高精度算法后,可处理任意长度整数运算,适用于密码学、大数据分析等领域。实际开发中需注意内存分配优化和运算效率提升。