高精度运算的计算思高精度运算计算中需要处理好以下几个问题:

  1) 数据的接收方法和存储方法
  数据的接收和存储:当输入的数很长时,可采用字符串方式输入,这样可输入数字很长的数,利用字符串函数和操作运算
将每一位数取出,存入数组中。
  2)高精度数位数的确定
  位数的确定:接收时往往用字符串,所以它的位数就等于字符串的长度
  3)进位,错位处理
  进位,错位处理
  加法运算:
 

c[i] = a[i] + b[i]
if(c[i]>10){
c[i]%10=10;
++c[i+1];
}

减法运算: 

if(a[i]<b[i]){
--a[i+1];
a[i]+=10;
}

乘法运算:

c[i+j-1]=a[i]*b[i]+x+c[i+j-1];
x = c[i+j-1]/10;
c[i+j-1]%=10;

 

算法实现 

#  关于 高精度加法

#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std ;

#define MAXLEN 110   // 确保长度 

int main(){
    char al[MAXLEN],bl[MAXLEN]; // 原始数字字符串

    // 两个加数结果 加数和结果的长度 进位
    int a[MAXLEN],b[MAXLEN],c[MAXLEN],
    lena,lenb,lenc,x;
    
    // 初始化
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));

    //输入加数和被加数
    scanf("%s%s",al,bl);

    // 计算两个字符串的长度
    lena = strlen(al);
    lenb = strlen(bl);

    //加数放入a数组
    for(int i=0;i<=lena-1;i++){
        a[lena-i]=al[i]-'0';
    }

    //加数放入b数组
    for(int i=0;i<=lenb-1;i++){
        b[lenb-i]=bl[i]-'0';
    }

    lenc = 1 ;
    x = 0 ;
    while(lenc<=lena || lenc<=lenb){  // 以两者中的最大的那个为 结束标识 
        c[lenc] = a[lenc] + b[lenc] + x ; // 两数相加
        x = (c[lenc]/10) ;  // 计算进位
        c[lenc] %= 10 ;     // 本位保留的数
        lenc++ ;
    }
    c[lenc] = x ;   // 排除非零问题 
    if(c[lenc]==0){
        lenc--; // 处理最高进位
    }

    for(int i=lenc;i>=1;i--){
        cout<<c[i] ;    // 输出结果
    }

    cout<<endl;
    return 0 ;

}
//高精度减法
#include<cstdio>
#include<cstring>
#include<iostream>

using namespace std ;

#define MAXLEN 110 

int main(){
    int a[MAXLEN],b[MAXLEN],c[MAXLEN],lena,lenb,lenc,i;
    char n[MAXLEN],n1[MAXLEN],n2[MAXLEN]; 
    
    // 初始化
    memset(a,0,sizeof(a));
    memset(b,0,sizeof(b));
    memset(c,0,sizeof(c));

    //输入减数和被减数
    scanf("%s%s",n1,n2);

    if(strlen(n1)<strlen(n2) || (strlen(n1)==strlen(n2)&&strcmp(n1,n2) < 0 )){
        strcpy(n,n1);
        strcpy(n1,n2);
        strcpy(n2,n);
        cout<<"-";  // 交换了减数和被减数,结果为负数
    }

    // 计算两个字符串的长度
    lena = strlen(n1);
    lenb = strlen(n2);

    //被减数放入a数组
    for(int i=0;i<=lena-1;i++){
        a[lena-i]=n1[i]-'0';
    }

    //减数放入b数组
    for(int i=0;i<=lenb-1;i++){
        b[lenb-i]=n2[i]-'0';
    }

    i = 1 ;
    while(i<=lena || i<=lenb){  //  什么时候结束 
       if(a[i]<b[i]){
           a[i]+=10;  // 不够减,那么向高位借1当十
           a[i+1]--;
       }
        c[i] = a[i]-b[i] ; // 对应位相减
        i++;
    }

    lenc = i ;
    while((c[lenc]==0)&&(lenc>1)){
        lenc--; //最高位的 0 不输出
    }

    for(i=lenc;i>=1;i--){
        cout<<c[i];
    }

    cout<<endl;
    return 0 ;

}