高精度相关模板
2016-11-17 15:35
239 查看
/* 高精度加法. */ #include<cstring> #include<cstdio> #include<iostream> #define MAXN 10001 using namespace std; int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3; char m[MAXN],n[MAXN]; void slove() { l3=max(l1,l2); for(int i=1;i<=l3;i++) { c[i]+=a[i]+b[i]; c[i+1]+=c[i]/10; c[i]%=10; } if(c[l3+1]) l3++; while(!c[l3]&&l3>1) l3--; for(int i=l3;i>=1;i--) printf("%d",c[i]); } int main() { freopen("add.in","r",stdin); freopen("add.out","w",stdout); scanf("%s",m+1);l1=strlen(m+1); scanf("%s",n+1);l2=strlen(n+1); for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; slove(); return 0; }
/* 高精度减法. */ #include<cstring> #include<cstdio> #include<iostream> #define MAXN 10001 using namespace std; int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3; char m[MAXN],n[MAXN]; void pre() { if(l1>l2) { for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; } else if(l1<l2){ printf("-"); for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48; } else if(strcmp(m+1,n+1)>=0) { for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; } else { printf("-"); for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48; } } void slove() { l3=max(l1,l2); for(int i=1;i<=l3;i++) { if(a[i]<b[i]) a[i+1]--,a[i]+=10; c[i]=a[i]-b[i]; } while(!c[l3]&&l3>1) l3--; for(int i=l3;i>=1;i--) printf("%d",c[i]); } int main() { freopen("sub.in","r",stdin); freopen("sub.out","w",stdout); scanf("%s",m+1);l1=strlen(m+1); scanf("%s",n+1);l2=strlen(n+1); pre(); slove(); return 0; }
/* 高精度乘法. */ #include<cstring> #include<cstdio> #include<iostream> #define MAXN 10001 using namespace std; int a[MAXN],b[MAXN],c[MAXN],l1,l2,l3; char m[MAXN],n[MAXN]; void slove() { int x; l3=l1+l2; for(int i=1;i<=l1;i++) { int x=0; for(int j=1;j<=l2;j++) { c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10; x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+l2]=x; } if(c[l3+1]) l3++; while(!c[l3]&&l3>1) l3--; for(int i=l3;i>=1;i--) printf("%d",c[i]); } int main() { freopen("mul.in","r",stdin); freopen("mul.out","w",stdout); scanf("%s",m+1);l1=strlen(m+1); scanf("%s",n+1);l2=strlen(n+1); for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; slove(); return 0; }
/* 高精度除法. */ #include<cstring> #include<cstdio> #include<iostream> #define MAXN 10001 using namespace std; int a[MAXN],b[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3; char m[MAXN],n[MAXN]; bool cmp() { if(tmp[0]>l1) return false; if(l1>tmp[0]) return true; for(int i=l1;i>=1;i--) { if(a[i]>tmp[i]) return true; if(a[i]<tmp[i]) return false; } return true; } bool cmp1() { for(int i=1;i<=l1;i++) { if(m[i]>n[i]) return true; if(m[i]<n[i]) return false; } return true; } void slovejian() { for(int i=1;i<=l1;i++) { if(a[i]<tmp[i]) a[i+1]--,a[i]+=10; a[i]-=tmp[i]; } while(!a[l1]&&l1>1) l1--; } void slove() { l3=l1-l2+1; for(int i=l3;i>=1;i--) { memset(tmp,0,sizeof tmp); for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j]; tmp[0]=l2+i-1; while(cmp()) c[i]++,slovejian(); } while(!c[l3]&&l3>1) l3--; for(int i=l3;i>=1;i--) printf("%d",c[i]); } int main() { scanf("%s",m+1);l1=strlen(m+1); scanf("%s",n+1);l2=strlen(n+1); if(l1>l2) { for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; } else if(l1<l2) { for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48; int t;t=l1,l1=l2,l2=t; } else if(cmp1()) { for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; } else { for(int i=1;i<=l1;i++) b[i]=m[l1-i+1]-48; for(int i=1;i<=l2;i++) a[i]=n[l2-i+1]-48; int t;t=l1,l1=l2,l2=t; } slove(); return 0; }
/* 高精度取模求余. */ #include<cstring> #include<cstdio> #include<iostream> #define MAXN 10001 using namespace std; int a[MAXN],b[MAXN],ans[MAXN],c[MAXN],tmp[MAXN],l1,l2,l3; char m[MAXN],n[MAXN]; bool cmp() { if(tmp[0]>l1) return false; if(l1>tmp[0]) return true; for(int i=l1;i>=1;i--) { if(a[i]>tmp[i]) return true; if(a[i]<tmp[i]) return false; } return true; } void slovejian() { for(int i=1;i<=l1;i++) { if(a[i]<tmp[i]) a[i+1]--,a[i]+=10; a[i]-=tmp[i]; } while(!a[l1]&&l1>1) l1--; } void chu() { l3=l1-l2+1; for(int i=l3;i>=1;i--) { memset(tmp,0,sizeof tmp); for(int j=1;j<=l2;j++) tmp[i+j-1]=b[j]; tmp[0]=l2+i-1; while(cmp()) c[i]++,slovejian(); } } void mul() { memset(tmp,0,sizeof tmp); tmp[0]=l2+l3; for(int i=1;i<=l2;i++) { int x=0; for(int j=1;j<=l3;j++) { tmp[i+j-1]+=b[i]*c[j]; x=tmp[i+j-1]/10; tmp[i+j]+=tmp[i+j-1]/10; tmp[i+j-1]%=10; } tmp[i+l3]=x; } if(tmp[tmp[0]+1]) tmp[0]++; while(tmp[tmp[0]]&&tmp[0]>1) tmp[0]--; } void slove() { chu();mul(); ans[0]=max(l2,l3); for(int i=1;i<=ans[0];i++) { if(ans[i]<tmp[i]) ans[i+1]--,ans[i]+=10; ans[i]-=tmp[i]; } while(!ans[ans[0]]&&ans[0]>1) ans[0]--; for(int i=ans[0];i>=1;i--) printf("%d",ans[i]); } int main() { scanf("%s",m+1);l1=strlen(m+1); scanf("%s",n+1);l2=strlen(n+1); for(int i=1;i<=l1;i++) a[i]=m[l1-i+1]-48,ans[i]=a[i]; for(int i=1;i<=l2;i++) b[i]=n[l2-i+1]-48; slove(); return 0; }
/* 高精度错排公式. f =(n-1)(f[n-1]+f[n-2]). */ #include<iostream> #include<cstring> #include<cstdio> #define MAXN 201 #define MAXM 1001 using namespace std; int f[MAXN][MAXM],n,tmp[MAXM],t[MAXM]; int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar(); return x*f; } void slove(int x) { memset(t,0,sizeof t); while(x) t[++t[0]]=x%10,x/=10;return ; } void add(int c[],int a[],int b[]) { c[0]=a[0]+b[0]; for(int i=1;i<=c[0];i++) { c[i]+=a[i]+b[i]; c[i+1]+=c[i]/10; c[i]%=10; } if(c[c[0]+1]) c[0]++; while(!c[c[0]]&&c[0]>1) c[0]--; return; } void mul(int c[],int a[],int b[]) { c[0]=a[0]+b[0]; for(int i=1;i<=a[0];i++) { int x=0; for(int j=1;j<=b[0];j++) { c[i+j-1]+=a[i]*b[j]; c[i+j]+=c[i+j-1]/10; x=c[i+j-1]/10; c[i+j-1]%=10; } c[i+b[0]]=x; } while(!c[c[0]]&&c[0]>1) c[0]--; return; } int main() { n=read(); if(n==0){printf("1");return 0;} f[1][0]=1,f[1][1]=0; f[2][0]=1,f[2][1]=1; for(int i=3;i<=n;i++) { memset(tmp,0,sizeof tmp); add(tmp,f[i-1],f[i-2]); slove(i-1); mul(f[i],t,tmp); } for(int i=f [0];i>=1;i--) printf("%d",f [i]); return 0; }