高精度模板(结构体)
看到了一篇很棒的高精度板子,先抄下来,以后慢慢研究( -ω- )
原文:https://blog.csdn.net/SkeletonKing233/article/details/92200315
# include <cstdio> # include <iostream> # include <cstring> # include <algorithm> # include <cmath> using namespace std; # define FOR(i, a, b) for(int i = a; i <= b; i++) # define _FOR(i, a, b) for(int i = a; i >= b; i--) struct BigInt { static const int M = 1000; int num[M + 10], len; BigInt() { clean(); } void clean(){ memset(num, 0, sizeof(num)); len = 1; } void read(){ char str[M + 10]; scanf("%s", str); len = strlen(str); FOR(i, 1, len) num[i] = str[len - i] - '0'; } void write(){ _FOR(i, len, 1) printf("%d", num[i]); puts(""); } void itoBig(int x){ clean(); while(x != 0){ num[len++] = x % 10; x /= 10; } if(len != 1) len--; } bool operator < (const BigInt &cmp) const { if(len != cmp.len) return len < cmp.len; _FOR(i, len, 1) if(num[i] != cmp.num[i]) return num[i] < cmp.num[i]; return false; } bool operator > (const BigInt &cmp) const { return cmp < *this; } bool operator <= (const BigInt &cmp) const { return !(cmp < *this); } bool operator != (const BigInt &cmp) const { return cmp < *this || *this < cmp; } bool operator == (const BigInt &cmp) const { return !(cmp < *this || *this < cmp); } BigInt operator + (const BigInt &A) const { BigInt S; S.len = max(len, A.len); FOR(i, 1, S.len){ S.num[i] += num[i] + A.num[i]; if(S.num[i] >= 10){ S.num[i] -= 10; S.num[i + 1]++; } } while(S.num[S.len + 1]) S.len++; return S; } BigInt operator - (const BigInt &A) const { BigInt S; S.len = max(len, A.len); FOR(i, 1, S.len){ S.num[i] += num[i] - A.num[i]; if(S.num[i] < 0){ S.num[i] += 10; S.num[i + 1]--; } } while(!S.num[S.len] && S.len > 1) S.len--; return S; } BigInt operator * (const BigInt &A) const { BigInt S; if((A.len == 1 && A.num[1] == 0) || (len == 1 && num[1] == 0)) return S; S.len = A.len + len - 1; FOR(i, 1, len) FOR(j, 1, A.len){ S.num[i + j - 1] += num[i] * A.num[j]; S.num[i + j] += S.num[i + j - 1] / 10; S.num[i + j - 1] %= 10; } while(S.num[S.len + 1]) S.len++; return S; } BigInt operator / (const BigInt &A) const { BigInt S; if((A.len == 1 && A.num[1] == 0) || (len == 1 && num[1] == 0)) return S; BigInt R, N; S.len = 0; _FOR(i, len, 1){ N.itoBig(10); R = R * N; N.itoBig(num[i]); R = R + N; int flag = -1; FOR(j, 1, 10){ N.itoBig(j); if(N * A > R){ flag = j - 1; break; } } S.num[++S.len] = flag; N.itoBig(flag); R = R - N * A; } FOR(i, 1, S.len / 2) swap(S.num[i], S.num[len - i + 1]); while(!S.num[S.len] && S.len > 1) S.len--; return S; } BigInt operator % (const BigInt &A) const { BigInt S; BigInt P = *this / A; S = *this - P * A; return S; } }; int main() { return 0; }
分类:
其他
, 其他——————高精度
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现