恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
C++高精度|竞赛(加减乘除模板)
首页
资讯中心
/
C++高精度|竞赛(加减乘除模板)
C++高精度|竞赛(加减乘除模板)
发布时间:2026/8/15 11:37:30
高精度篇文章目录高精度篇1.1高精度核心原理1.2高精度加法1.3高精度减法1.4高精度乘法1.4.1高精度*低精度1.4.2高精度*高精度1.5高精度除法1.5.1低精度/低精度1.5.2高精度/低精度2.高精度快速幂1.1高精度核心原理适用场景数字超过 long long 范围超过1e18。高精度算法High Accuracy Algorithm是处理大数字的数学计算 方法。在一般的科学计算中会经常算到小数点后几百位或者更多存储规则统一规则全部运算通用用字符串读入大数转 vector 存每一位reverse 倒置低位存在下标 0运算结束删除前导0输出倒序输出1.2高精度加法P1601 高精度加法 - 洛谷从低位逐位相加记录进位最后处理剩余进位。#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; vectorlla; vectorllb; string a1,b1; ll la,lb,lc; int main() { IOS cina1b1; laa1.size(); lbb1.size(); lcmax(la,lb)1; for(ll i0;ila;i) { a.push_back(a1[i]-0); } for(ll i0;ilb;i) { b.push_back(b1[i]-0); } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); vectorllc(lc,0); for(ll i0;ilc;i) { c[i](a[i]b[i]); c[i1]c[i]/10; c[i]c[i]%10; } while(c.size()1c.back()0) { c.pop_back(); } for(ll ic.size()-1;i0;i--) { coutc[i]; } coutendl; // coutfixedsetprecision(x) ; return 0; }1.3高精度减法P2142 高精度减法 - 洛谷必须先比较大小大减小如果小数−大数交换两数最后输出负号逐位相减不够减向前借位删除前导0#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; vectorlla; vectorllb; string a1,b1; ll la,lb,lc; bool cmp(string a1,string b1)\ { if(a1.size()!b1.size()) { return a1.size()b1.size(); } for(ll i0;ia1.size();i) { if(a1[i]!b1[i]) { return a1[i]b1[i]; } } return true; } int main() { IOS cina1b1; bool flagtrue; if(!cmp(a1,b1)) { swap(a1,b1); flagfalse; } laa1.size(); lbb1.size(); lcmax(la,lb); a.clear(); b.clear(); for(ll i0;ila;i) { a.push_back(a1[i]-0); } for(ll i0;ilb;i) { b.push_back(b1[i]-0); } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); vectorllc(lc,0); ll t0; for(ll i0;ilc;i) { c[i]a[i]-t; if(ilb) { c[i]-b[i]; } if(c[i]0) { c[i]10; t1; } else { t0; } } while(c.size()1c.back()0) { c.pop_back(); } if(!flag) { cout-; } for(ll ic.size()-1;i0;i--) { coutc[i]; } coutendl; // coutfixedsetprecision(x) ; return 0; }1.4高精度乘法1.4.1高精度*低精度大数每一位 × 普通整数统一进位。#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); using namespace std; int main() { IOS string a1; ll x; cina1x; vectorlla; ll laa1.size(); for(ll i0;ila;i) { a.push_back(a1[i]-0); } reverse(a.begin(),a.end()); vectorllc; ll t0; for(ll i0;ila||t;i) { if(ila) ta[i]*x; c.push_back(t%10); t/10; } while(c.size()1c.back()0) { c.pop_back(); } for(ll ic.size()-1;i0;i) { coutc[i]; } coutendl; return 0; }1.4.2高精度*高精度L-A × B_河南萌新联赛2026第四场南阳理工学院c[ij] a[i] * b[j]结果数组长度 len(a) len(b)最后统一进位、去前导0#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; vectorlla; vectorllb; string a1,b1; ll l1,l2; int main() { IOS cina1b1; l1a1.size(); l2b1.size(); for(char c:a1) { a.push_back(c-0); } for(char c:b1) { b.push_back(c-0); } reverse(a.begin(),a.end()); reverse(b.begin(),b.end()); vectorllc(l1l2,0); for(ll i0;il1;i) { for(ll j0;jl2;j) { c[ij]a[i]*b[j]; } } ll t0; for(ll i0;ic.size();i) { tc[i]; c[i]t%10; t/10; } if(c.size()1c.back()0) { c.pop_back(); } for(ll ic.size()-1;i0;i--) { coutc[i]; } // coutfixedsetprecision(x) ; return 0; }1.5高精度除法P1480 A/B Problem高精度除法Ⅰ - 洛谷加减乘从低位下标0算除法必须从高位往低位算1.5.1低精度/低精度保留n位小数#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; int main() { IOS ll a0; ll b0; ll n0;//保留小数个数 cinabn; couta/b.; ll ta%b; for(ll i0;in;i) { tt*10; coutt/b; tt%b; } // coutfixedsetprecision(x) ; return 0; }1.5.2高精度/低精度#includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second #define PLL pairll, ll #define YES coutYESendl; #define NO coutNOendl; using namespace std; string s; ll b0; vectorlla; int main() { IOS cinsb; ll las.size(); vectorllc(la,0); for(ll i0;ila;i) { a.push_back(s[i]-0); } ll t0; for(ll i0;ila;i) { tt*10a[i]; if(tb) { c[i]t/b; tt%b; } else { c[i]0; } } ll id0; for(ll i0;ila;i) { if(c[i]!0) { idi; break; } } for(ll iid;ila;i) { coutc[i]; } cout......t; // coutfixedsetprecision(x) ; return 0; }高精度/高精度不常考2.高精度快速幂P1045 [NOIP 2003 普及组] 麦森数[P1045 NOIP 2003 普及组] 麦森数 - 洛谷题目给定 P求(2P-1)输出它的十进制位数输出最后 500 位每行 50 位一共 10 行高位补 0// #includebits/stdc.h #define ll long long #define endl \n #define IOS ios::sync_with_stdio(0),cin.tie(0),cout.tie(0); #define ull unsigned long long #define fi first #define se second const ll N500; const ll base10000; using namespace std; ll a[N]{0}; ll b[N]{0}; ll tmp[N]; void gjd2(ll a1[],ll b[]) { memset(tmp,0,sizeof(tmp)); for(ll i0;iN;i) { if(a1[i]0) { continue; } for(ll j0;ijN;j) { tmp[ij]a1[i]*b[j]; } } for(ll i0;iN-1;i) { tmp[i1]tmp[i]/10; tmp[i]%10; } tmp[N-1]%10; memcpy(a1,tmp,sizeof(tmp)); } void ksm(ll p) { memset(a,0,sizeof(a)); memset(b,0,sizeof(b)); a[0]1; b[0]2; while(p) { if(p1) { gjd2(a,b); } p1; if(p) { gjd2(b,b); } } a[0]--; } int main() { IOS ll p; cinp; cout(int)(p*(log10(2)))1endl; ksm(p); ll cnt0; for(ll j499;j0;j--) { couta[j]; if(j%500) { coutendl; } } coutendl; return 0; }