hzx198 @ 2024-03-07 05:43:12
压 5 位高精,100 位以上直接截断,为什么错?
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
struct N {ll v[200];}; // v[0] 记录位数
// 高精乘高精
N operator*(const N& a, const N& b) {
if (a.v[0] < b.v[0]) return b * a;
N r = {{1, 0}}; // 位数为 1, 值为 0
for (int i = 1; i <= b.v[0]; i++) {
for (int j = 1; j <= a.v[0]; j++) {
r.v[i + j - 1] += a.v[j] * b.v[i];
}
}
for (int i = 1; i <= r.v[0]; i++) {
if (r.v[i] >= 100000) {
r.v[i + 1] += r.v[i] / 100000;
r.v[i] %= 100000;
if (i == r.v[0] && i < 100) r.v[0]++; // 100 位以上直接跳过
}
}
return r;
}
// 高精输出
void write(N a) {
for (int i = 100, j = 0; i > 0; i--, j++) {
if (j == 10) puts(""), j = 0; // 50 位换行
printf("%05lld", a.v[i]);
}
}
// 快速幂
N qpow(N a, ll b) {
N r = {{1, 1}};
while (b) {
if (b & 1) r = r * a;
a = a * a, b >>= 1;
}
return r;
}
int main(void) {
ll p;
cin >> p;
cout << ceil(p * log10(2)) << endl;
N a = {{1, 2}};
a = qpow(a, p);
a.v[1]--;
write(a);
return 0;
}
by hzx198 @ 2024-03-21 20:55:13
dd