模板大全
这里存放本人的一些板子
不定期会更吖,主要还是人懒
1.高精度加法
#include<bits/stdc++.h> using namespace std; char ch[205]; int a[205],b[205],f[205]; int lena,lenb,len; int main() { cin>>ch+1; lena=strlen(ch+1); reverse(ch+1,ch+lena+1); for(int i=1;i<=lena;i++) a[i]=ch[i]-'0'; cin>>ch+1; lenb=strlen(ch+1); reverse(ch+1,ch+lenb+1); for(int i=1;i<=lenb;i++) b[i]=ch[i]-'0'; len=max(lena,lenb); for(int i=1;i<=len;i++) f[i]=a[i]+b[i]; for(int i=1;i<=len;i++) { f[i+1]+=f[i]/10; f[i]%=10; } if(f[len+1])len++; while(f[len]==0&&len>1)len--; for(int i=len;i>=1;i--) cout<<f[i]; return 0; }
2.高精度减法
#include <bits/stdc++.h> using namespace std; string s1,s2; int l1,l2,a[10005],b[10005],c[10005]; bool f; bool dx()//判断大小的函数 { if(l1>l2) return false; if(l1<l2) return true; for(int i=l1;i>=1;i--) if(a[i]<b[i]) return true; return false; } int main() { cin>>s1>>s2; l1=s1.length(); for(int i=0;i<l1;i++) a[l1-i]=s1[i]-48; l2=s2.length(); for(int i=0;i<l2;i++) b[l2-i]=s2[i]-48; if(dx()) { for(int i=1;i<=l2;i++) swap(a[i],b[i]); swap(l1,l2); f=true; } for(int i=1;i<=l1;i++){ if(a[i]<b[i]){ a[i]+=10; a[i+1]--; } c[i]=a[i]-b[i]; } while(c[l1]==0&&l1>1) l1--; if(f) cout<<'-'; for(int i=l1;i>=1;i--) cout<<c[i]; return 0; }
3.高精度乘法
#include<bits/stdc++.h> using namespace std; char a1[10001],a2[10001]; int b1[10001],b2[10001],h[1000001]; int main() { int l1,l2; cin>>a1; cin>>a2; l1=strlen(a1); l2=strlen(a2); for(int i=0;i<l1;i++) b1[i]=a1[l1-1-i]-48; for(int i=0;i<l2;i++) b2[i]=a2[l2-1-i]-48; int x; for(int i=0;i<l1;i++) { x=0; for(int j=0;j<l2;j++) { h[i+j]+=b1[i]*b2[j]+x; x=h[i+j]/10; h[i+j]%=10; } h[i+l2]+=x; } int l3=l1+l2; while(l3>0&&h[l3]==0) l3--; for(int i=l3;i>=0;i--) cout<<h[i]; cout<<endl; }
说实话,高精度模板太ex了啊啊啊
4.递归回溯框架
int s(int k) { for(int i=1;i<=情况种数;i++) { if(满足判断条件) { 保存结果 if(搜完了) 输出 else s(k+1)//继续搜下一个 恢复原有状态 } } }
5.快速幂
#include<bits/stdc++.h> #define ll long long using namespace std; ll n,m,k; ll pm(ll a,ll b,ll mod){ ll res=1; if(b==0) return 1%mod; while(b>0){ if(b&1){ res=res*a%mod; } a=a*a%mod; b>>=1; } return res; } int main(){ scanf("%lld%lld%lld",&n,&m,&k); printf("%lld^%lld mod %lld=%lld\n",n,m,k,pm(n,m,k)); return 0; }
唔......从同学那借鉴过来的QAQ
PS:适用于nm mod k
6.快速排序
#include<iostream> using namespace std; int n,a[100010]; void qsort(int l,int r){ int mid=a[(l+r)/2]; int i=l,j=r; do{ while(a[i]<mid)i++; while(a[j]>mid)j--; if(i<=j){ swap(a[i],a[j]); i++; j--; } }while(i<=j); if(l<j)qsort(l,j); if(i<r)qsort(i,r); } int main(){ cin>>n; for(int i=1;i<=n;i++) cin>>a[i]; qsort(1,n); for(int i=1;i<=n;i++) cout<<a[i]<<" "; return 0; }
C++ 选手请不要试图使用STL,虽然你可以使用sort一遍过,但是你并没有掌握快速排序算法的精髓。——摘自洛谷P1177
7.求两数最小公倍数
#include<bits/stdc++.h> using namespace std; int x,y; int gcd(int x,int y) { int r=x%y; while(r!=0) { x=y; y=r; r=x%y; } return y; } int lcm() { return x*y/gcd(x,y); } int main() { int m,n; cin>>x>>y; cout<<lcm(); }
8.求两数最大公因数
#include<bits/stdc++.h> using namespace std; int gcd(int x,int y) { if(y==0) return x; else return gcd(y,x%y); } int main() { int x,y; cin>>x>>y; cout<<gcd(x,y); }
9.判断是否为素数(函数)
bool prime(int n) { if(n<=1) return 0; if(n==2) return 1; for(int i=2;i<=sqrt(n);i++) if(n%i==0) return 0; return 1; }
10.斐波那契数列(递归)
#include<bits/stdc++.h> using namespace std; int js(int a) { if(a==1||a==2) return 1; else return js(a-1)+js(a-2); } int main() { int n; cin>>n; cout<<js(n); }
本文来自博客园,作者:浅夏诗吟,转载请注明原文链接:https://www.cnblogs.com/qian-xia/p/15418362.html