章节概述

模拟是按题意逐步执行操作;高精度用于处理超出标准整数范围的大数运算。
两者是算法竞赛中最基础的实现能力。

核心原理

1. 高精度存储方式

将数字按存入数组,低位在下标 0(逆序存储),方便进位处理。

数字: 12345
数组: [5, 4, 3, 2, 1] (低位在低地址)

2. 高精度加法核心

for i in 0..len-1:
 sum[i] += a[i] + b[i]
 sum[i+1] += sum[i] / 10 // 进位
 sum[i] %= 10 // 当前位

3. 高精度乘法核心

res[i+j] += a[i] * b[j] // 10^i × 10^j = 10^(i+j)
然后逐位处理进位

4. 前导零处理

while (len > 1 && res[len-1] == 0) len--;

关键数据结构


P1601 A+B Problem(高精)

题目: 高精度加法,两个不超过 10^500 位的非负整数之和。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
int main() {
 string a, b;
 cin >> a >> b;
 reverse(a.begin(), a.end());
 reverse(b.begin(), b.end());
 int len = max(a.size(), b.size());
 int sum[505] = {0};
 for (int i = 0; i < len; i++) {
 if (i < (int)a.size()) sum[i] += a[i] - '0';
 if (i < (int)b.size()) sum[i] += b[i] - '0';
 }
 for (int i = 0; i < len; i++) {
 if (sum[i] >= 10) {
 sum[i + 1] += sum[i] / 10;
 sum[i] %= 10;
 }
 }
 if (sum[len] > 0) len++;
 for (int i = len - 1; i >= 0; i--)
 cout << sum[i];
 cout << endl;
 return 0;
}

P1303 A*B Problem(高精)

题目: 高精度乘法,两个不超过 2000 位的非负整数之积。

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;
 
int main() {
 string a, b;
 cin >> a >> b;
 reverse(a.begin(), a.end());
 reverse(b.begin(), b.end());
 int res[4005] = {0};
 for (int i = 0; i < (int)a.size(); i++)
 for (int j = 0; j < (int)b.size(); j++)
 res[i + j] += (a[i] - '0') * (b[j] - '0');
 int len = a.size() + b.size();
 for (int i = 0; i < len; i++) {
 res[i + 1] += res[i] / 10;
 res[i] %= 10;
 }
 while (len > 1 && res[len - 1] == 0) len--;
 for (int i = len - 1; i >= 0; i--)
 cout << res[i];
 cout << endl;
 return 0;
}

P1009 [NOIP1998 普及组] 阶乘之和

题目: S = 1! + 2! + … + n! (n ≤ 50),用高精度计算。

#include <iostream>
using namespace std;
 
int res[100] = {0}, fac[100] = {1};
 
int main() {
 int n;
 cin >> n;
 for (int i = 1; i <= n; i++) {
 for (int j = 0; j < 100; j++)
 fac[j] *= i;
 for (int j = 0; j < 99; j++) {
 fac[j + 1] += fac[j] / 10;
 fac[j] %= 10;
 }
 for (int j = 0; j < 100; j++) {
 res[j] += fac[j];
 res[j + 1] += res[j] / 10;
 res[j] %= 10;
 }
 }
 int p = 99;
 while (p > 0 && res[p] == 0) p--;
 for (; p >= 0; p--) cout << res[p];
 cout << endl;
 return 0;
}

推荐练习题(洛谷)


相关技巧


  • 数组: 高精度数用数组按位存储
  • 循环: 逐位运算依赖循环
  • 函数结构体: 封装高精度运算为结构体+运算符重载

多平台练习

| 洛谷 | 本题单 | 竞赛基础 |
| POJ (北大) | PKU JudgeOnline | 经典题目,适合巩固 |
| HDU (杭电) | HDU OJ | 暑期多校训练 |
| Codeforces | Codeforces | 国际竞赛,适合提升 |