高精度(阶乘,加法,减法,乘法,高精乘低精,高精除低精)模板.
最近深受高精度的困扰,想用又不是很熟练,就把高精度板子都整理了一遍了,除了高精除高精没写,
不想写了,太懒了。 还是
香。
便于以后使用和回顾。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=5e6+100;
#define mst(a) memset(a,0,sizeof a)
char a[N],b[N];
struct num{
int len,c[N];
}A,B,ans;
num fac(int n){ //高精度阶乘
num a;
int p[N];
mst(p);
memset(a.c,0,sizeof a.c);
a.c[1]=1,a.len=1;
for(int i=1;i<=n;i++){
for(int j=1;j<=a.len;j++){
a.c[j]=i*a.c[j]+p[j];p[j]=0;
if(a.c[j]>9){
p[j+1]=a.c[j]/10;
a.c[j]%=10;
if(j==a.len) a.len++;
}
}
}
return a;
}
num add(num a,num b){ //高精加
num ans;
memset(ans.c,0,sizeof ans.c);
int l=max(a.len,b.len),p=0;
ans.len=l;
for(int i=1;i<=l;i++){
ans.c[i]=a.c[i]+b.c[i]+p;
p=ans.c[i]/10;
ans.c[i]%=10;
}
if(p) ans.c[++ans.len]=p;
return ans;
}
num multi(num a,num b){ //高精乘
num ans;
memset(ans.c,0,sizeof ans.c);
int l=a.len+b.len-1,p=0;
for(int i=1;i<=a.len;i++)
for(int j=1;j<=b.len;j++)
ans.c[i+j-1]+=a.c[i]*b.c[j];
for(int i=1;i<=l;i++){
ans.c[i+1]+=ans.c[i]/10;
ans.c[i]%=10;
}
if(ans.c[l+1]) l++;
ans.len=l;
return ans;
}
num sub(num a,num b){ //高精减
int f=0;
if(a.len<b.len) swap(a,b),f=1;
else if(a.len==b.len){
for(int i=1;i<=a.len;i++)
if(a.c[i]<b.c[i]){
f=1;
swap(a,b);
break;
}
}
for(int i=1;i<=a.len;i++){
int x=a.c[i]-b.c[i];
if(x<0) x+=10,a.c[i+1]--;
a.c[i]=x;
}
if(f) printf("-");
int j=a.len;
while(!a.c[j]&&j>1) j--;
a.len=j;
return a;
}
void l_add(num &a,int x){ //高精乘低精
int p=0;
for(int i=1;i<=a.len;i++){
a.c[i]=a.c[i]*x+p;
p=a.c[i]/10;
a.c[i]%=10;
}
while(p){
a.c[++a.len]=p;
p/=10;
a.c[a.len]%=10;
}
}
void div(num &a,int x){ //高精除低精度.(向下取整)
int p=0;
for(int i=a.len;i>=1;i--){
p=p*10+a.c[i];
a.c[i]=p/x;
p%=x;
}
while(!a.c[a.len]) a.len--;
}
int main(){
/*
int x;
scanf("%s%d",a+1,&x);
A.len=strlen(a+1);
for(int i=1;i<=A.len;i++)
A.c[i]=a[A.len+1-i]-'0';
div(A,x);
for(int i=A.len;i>=1;i--)
printf("%d",A.c[i]);
scanf("%s%s",a+1,b+1);
A.len=strlen(a+1),B.len=strlen(b+1);
for(int i=1;i<=B.len;i++)
B.c[i]=b[B.len+1-i]-'0';
ans=add(A,B);
for(int i=ans.len;i>=1;i--)
printf("%d",ans.c[i]);
*/
return 0;
} 
京公网安备 11010502036488号