您的位置:首页 > 其它

高精度相关模板

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: