大数的模板题
https://ac.nowcoder.com/acm/contest/38105/D

#include<bits/stdc++.h> typedef unsigned long long LL; using namespace std; LL digit = 1e13; LL nums[200010]; int idx = 0; void Output(LL& num) { int cnt = 0; LL o = num; while (num) { cnt++; num /= 10; } for (int i = cnt; i < 13; i++) cout << 0; cout << o; } int main() { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); int n; cin >> n; cout << 1 << ' '; if (n == 1) { cout << 2.5 << endl; return 0; } nums[0] = 2; int p5 = 1; for (int i = 2; i <= n; i++) { for (int i = 0; i <= idx; i++) nums[i] *= 2; nums[0] += 1; if(i==n||i%10==0) for (int i = 0; i <=idx; i++) { if (nums[i] >= digit) { nums[i + 1] += nums[i]/digit; nums[i] %= digit; if (i == idx) idx++; } } } cout << nums[idx]; for (int i = idx-1; i >= 0; i--) Output(nums[i]); cout << ".5" << endl; return 0; }
注意:
输出时记得补0
此题,由于可以每次仅*2,可以每10次计算后再进位(不超过10^20,long long 范围内)。
也就是说,如果一个数字存储13位,但是一个数字的范围时20位,没必要超过13位就进位,可以等到全部接近20位,这样处理更快。