• 高精度计算 -- 超大数运算


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

      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 ;
    
    }

     

  • 相关阅读:
    VM启用ISO共享
    部署服务--NLB
    SCVMM问题汇总
    判断文件是否存在(exist)
    函数(Function)作用域 / 远程函数执行
    基于433MHz无线串口,多发一收解决方案
    ZigBee自组网地址分配与路由协议概述
    Zigbee协议栈--Z-Stack的使用
    RT-Thread RTOS
    信息量、互斥信息量和事件标志
  • 原文地址:https://www.cnblogs.com/Skypeduty1225/p/15003653.html
Copyright © 2020-2023  润新知