整理的高精度算法

以前做过一些高精度的题目,可以用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;
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值