社区讨论
神秘递归高精度
学术版参与者 2已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @mk561zyc
- 此快照首次捕获于
- 2026/01/08 16:09 上个月
- 此快照最后确认于
- 2026/01/10 21:45 上个月
突发奇想为什么没有__int256,__int114514,然后想能不能直接把64位拼成128,甚至更高。随便实现了一下
实际上就是压位高精度。
并且还不支持动态变化数位长度。
并且还难写,调了一堆bug出来,甚至可能有潜在的bug因为数据太水没测出来,那个高精度A+B问题就5个测试点。
并且还得手动去除前导0。
并且还难读。
并且时空复杂度常数莫名大了很多,因为递归算法,因为递归模板(参见隔壁线段树),因为编译期生成。
CPP#include <bits/stdc++.h>
using namespace std;
using lint = long long;
int n, m, t, x, y;
template<int Lv>
struct s
{
static constexpr size_t len = s<Lv - 1>::len << 1;
s<Lv - 1> a, b;
pair<bool, s &> ad(const s &o, bool x = 0)
{
auto p = a;
return {a.ad(o.a, b.ad(o.b, x).first).first, *this};
}
string &build(string &p)
{
b.build(p);
return a.build(p);
}
void get(string &p)
{
a.get(p);
b.get(p);
}
};
template<>
struct s<0>
{
static constexpr size_t len = 9;
unsigned a;
string &build(string &p)
{
if(p.empty())
{
a = 0;
return p;
}
a = stoul(p.substr(max(0ll, (lint)p.size() - 9), 9));
p.resize(max((lint)p.size() - 9, 0ll));
return p;
}
pair<bool, s &> ad(const s &o, bool x = 0)
{
unsigned p = a;
a += o.a + x;
a %= 1000000000;
return {p + x > a, *this};
}
void get(string &p)
{
string s = to_string(a);
p.append(string(len - s.size(), '0')).append(s);
}
};
signed main()
{
ios::sync_with_stdio(0), cin.tie(0);
s<6> a, b;
string q;
cin >> q;
a.build(q);
cin >> q;
b.build(q);
a.ad(b);
q.clear();
a.get(q);
int i = 0;
for(; i < q.size() - 1; i++)
if(q[i] != '0')
break;
cout << q.substr(i, q.size());
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...