高精度计算

高精度运算,是指参与运算的数(加数,减数,因子……)范围大大超出了标准数据类型(整型,实型)能表示的范围的运算。例如,求两个20000位的数的和。这时,就要用到高精度算法了。

1、高精度加法

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
    int len,a[510];
    node(){
        len=0;
        memset(a,0,sizeof(a));
    }
};
int mymax(int x,int y){
    return x>y?x:y;
}
node jiafa(node n1,node n2){
    node n0;
    n0.len=mymax(n1.len,n2.len);
    for(int i=1;i<=n0.len;i++){
        n0.a[i]=n1.a[i]+n2.a[i];
    }//先每个位相加
    for(int i=1;i<=n0.len;i++){
        n0.a[i+1]+=n0.a[i]/10;
        n0.a[i]%=10;
    }//进位
    int i=n0.len;
    while(n0.a[i+1]>0){
        i++;
        n0.a[i+1]+=n0.a[i]/10;
        n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1))
        i--;
        n0.len=i;
        return n0;
}//判断位数
int main()
{
    char st[511];
    node n0,n1,n2;
    scanf("%s",st+1);
    n1.len=strlen(st+1);
    for(int i=1;i<=n1.len;i++)
        n1.a[n1.len-i+1]=st[i]-'0';
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
        n2.a[n2.len-i+1]=st[i]-'0';
    n0=jiafa(n1,n2);
    for(int i=n0.len;i>=1;i--)
        printf("%d",n0.a[i]);
        cout<<endl;
    return 0;
}

 

2、高精度减法(两正数)

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
    int len,a[510];
    node(){
    len=0;
    memset(a,0,sizeof(a));
    }
};
int mymax(int x,int y){
    return x>y?x:y;
}
int bijiao(node n1,node n2){
    if(n1.len>n2.len) return 1;
    if(n1.len<n2.len) return -1;
    for(int i=n1.len;i>=1;i--){
        if(n1.a[i]>n2.a[i]) return 1;
        if(n1.a[i]<n2.a[i]) return -1;
    }
    return 0;
}
node jianfa(node n1,node n2){
    node n0;
    n0.len=n1.len;
    for(int i=1;i<=n0.len;i++)
        n0.a[i]=n1.a[i]-n2.a[i];
    for(int i=1;i<=n0.len;i++){
        if(n0.a[i]<0){
            n0.a[i+1]--;
            n0.a[i]+=10;
        }
    }
    int i=n0.len;
    while(n0.a[i+1]>0){
        i++;
        n0.a[i+1]=n0.a[i]/10;
        n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1)) i--;
    n0.len=i;
    return n0;
}
int main(){
    char st[511];
    node n0,n1,n2;
    scanf("%s",st+1);
    n1.len=strlen(st+1);
    for(int i=1;i<=n1.len;i++)
        n1.a[n1.len-i+1]=st[i]-'0';
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
        n2.a[n2.len-i+1]=st[i]-'0';
    int tt=bijiao(n1,n2);//判断结果是否为负
    if(tt>=0) n0=jianfa(n1,n2);
    else n0=jianfa(n2,n1);//用较大的减
    if(tt<0){
        cout<<"-";//为负则输出“-”
        for(int i=n0.len;i>=1;i--)
            printf("%d",n0.a[i]);
    }
    else{
        for(int i=n0.len;i>=1;i--)
            printf("%d",n0.a[i]);
    }

}

 

3、高精度乘法

#include<cstdio>
#include<iostream>
#include<cstring>
using namespace std;
struct node{
    int len,a[510];
    node(){
        len=0;
        memset(a,0,sizeof(a));
    }
};
node chengfa(node n1,node n2){
    node n0;
    n0.len=n1.len+n2.len-1;
    for(int i=1;i<=n1.len;i++){
        for(int j=1;j<=n2.len;j++){
            n0.a[i+j-1]+=n1.a[j]*n2.a[j];
        }
    }//累乘
    for(int i=1;i<=n0.len;i++){
        n0.a[i+1]+=n0.a[i]/10;
        n0.a[i]%=10;
    }//进位
    int i=n0.len;
    while(n0.a[i+1]>0){
        i++;
        n0.a[i+1]=n0.a[i]/10;
        n0.a[i]%=10;
    }
    while((n0.a[i]==0)&&(i>1)) i--;
    n0.len=i;
    return n0;
} //判断位数
int main(){
    char st[511];
    node n0,n1,n2;
    scanf("%s",st+1);
    n1.len=strlen(st+1);
    for(int i=1;i<=n1.len;i++)
        n1.a[n1.len-i+1]=st[i]-'0';
    scanf("%s",st+1);
    n2.len=strlen(st+1);
    for(int i=1;i<=n2.len;i++)
        n2.a[n2.len-i+1]=st[i]-'0';
    n0=chengfa(n1,n2);
    for(int i=n0.len;i>=1;i--) cout<<n0.a[i];
    cout<<endl;
    return 0;
}

 

posted @ 2020-03-10 19:09  赵学霖  阅读(208)  评论(0编辑  收藏  举报