以前做过一些高精度的题目,可以用java的BigInteger,但是运行时间长,还是用C写高精度好,整理出了几种常用的。
主要思想是用数组保存数字。
//a=a*b 大整数a* 整数 b , M进制
void mult(int *a,int b)
{
int w,i;
int M=10000;
w=a[0];a[0]=0;
for(i=1;i<=w;i++)a[i]=a[i]*b;
for(i=w;i>=1;i--)if(a[i]>=M){a[i-1]+=a[i]/M;a[i]%=M;}
if(a[0])
{
w++;for(i=w;i>=1;i--)a[i]=a[i-1];
}
a[0]=w;
}
//d=a*b 大整数a* 整数(一般) b 输出 "%04d" 10000进制
void mult(int *a,int b,int *d)
{
int w,i,M=10;
w=a[0];d[0]=0; //a 是M 进制 a[0]位数
for(i=1;i<=w;i++)d[i]=a[i]*b;
for(i=w;i>=1;i--)if(d[i]>=M){d[i-1]+=d[i]/M;d[i]%=M;}
if(d[0])
{
w++;for(i=w;i>=1;i--)d[i]=d[i-1];
}
d[0]=w;
}
void PR(int *a)//输出1000进制的数
{
int i;
printf("%d",a[1]);
for(i=2;i<=a[0];i++)
printf("%01d", a[i]);
printf("/n");
}
//大整数a+ 大整数 b c=a+b;
void add(int *a,int *b,int *c)
{
// c=a+b;
int m,n,i,j,k,M=10;
m=a[0]; n=b[0];
if(m<n)k=n; else k=m;
for(i=0;i<=k;i++) c[i]=0;
j=k;
for(i=n;i>=1;i--,j--) c[j]=b[i];
j=k;
for(i=m;i>=1;i--,j--) c[j]+=a[i];
for(i=k;i>=1;i--)
{
if(c[i]>=M) { c[i-1]++; c[i]-=M; }
}
if(c[0])
{
k++;
for(i=k;i>=1;i--) c[i]=c[i-1];
}
c[0]=k;
}
void Change(char *ch,int *a)//把字符串转化为数字存在数组a中
{
int lenth=strlen(ch),i;
a[0]=lenth;
for(i=1;i<=lenth;i++)
{
a[i]=ch[i-1]-'0';
}
}
//大整数a/ 整数 b
// c=a/b, k=a%b
void Div(int *a,int b,int *c)
{
int i,j,s,t,M=10;//输出 "%05d" 100000进制
int k=0,q;
for(i=1;i<=a[0];i++)
{
q=k*M+a[i];
c[i]=q/b;k=q%b;
}
if(c[1]==0)
{
for(i=1;i<a[0];i++)c[i]=c[i+1];c[0]=a[0]-1;
}
else c[0]=a[0];
}
//大整数a*大整数 b; M 进制
void mult(int *a,int *b,int *c)
{
//c=a*b;
int i,j,m,n,k,M=10;
if(a[0]==1&&a[1]==0||b[0]==1&&b[1]==0) //
{
c[0]=1;c[1]=0;return;
}
m=a[0];n=b[0];
k=n+m-1;
for(i=0;i<=k;i++)c[i]=0;
for(i=1;i<=m;i++)
{
if(a[i])for(j=1;j<=n;j++)if(b[j])c[i+j-1]+=a[i]*b[j];
}
for(i=k;i>=1;i--)if(c[i]>=M){ c[i-1]+=c[i]/M;c[i]%=M;}
if(c[0]>0)
{
k++;
for(i=k;i>=1;i--)c[i]=c[i-1];
}
c[0]=k;
}
//大整数a=a-1; M 进制
void sub(int *a)
{
int k=a[0],i;
int M=10;
a[k]--;
for(i=k;i>=1;i--)
{
if(a[i]<0){a[i]=M-1;a[i-1]--;}
else break;
}
if(a[1]==0)
{
for(i=1;i<a[0];i++)a[i]=a[i+1];
a[0]=k-1;
}
}