• 算法疑难(c++实现)---3、高精度加法


    算法疑难(c++实现)---3、高精度加法

    一、总结

    一句话总结:

    A、高精度加法的原理就是小学学的竖式加法的操作,只是编程实现而已,输入的话,就用字符串
    B、但是计算的时候,我们可以用数组,数组中的每一位存储一个数字,相加就逐位相加,然后进位就好
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int a[1000]={0},b[1000]={0};
    
    //字符串反向转成数组
    void init(string s,int a[]){
        //我们把字符串的长度,也就是数字的位数,存在a[0]
        a[0]=s.length();
        //字符串反向转成数组
        for(int i=1;i<=a[0];i++){
            a[i]=s[a[0]-i]-'0';
        }
    }
    
    //逐位相加,并且进位
    void add(int a[],int b[]){
        //确定a数组和b数组位数的最大值,这样逐位相加做循环的时候好做
        a[0]=max(a[0],b[0]);
        //逐位相加
        for(int i=1;i<=a[0];i++){
            a[i]+=b[i];
        }
        //处理进位
        for(int i=1;i<=a[0];i++){
            if(a[i]/10) a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        //最高位进位的话,要将数字的长度加1
        if(a[a[0]+1]) a[0]++;
    }
    
    //反向输出数组
    void print(int a[]){
        for(int i=a[0];i>=1;i--){
            cout<<a[i];
        }
        cout<<endl;
    }
    
    int main(){
        string sa,sb;
        cin>>sa;
        cin>>sb;
        init(sa,a);
        init(sb,b);
        add(a,b);
        print(a);
        return 0;
    }

    1、高精度加法的算法步骤?

    1、字符串反向转成数组
    2、数组逐位相加,并且进位
    3、反向输出数组
    #include <iostream>
    #include <algorithm>
    using namespace std;
    int a[1000]={0},b[1000]={0};
    
    //字符串反向转成数组
    void init(string s,int a[]){
        //我们把字符串的长度,也就是数字的位数,存在a[0]
        a[0]=s.length();
        //字符串反向转成数组
        for(int i=1;i<=a[0];i++){
            a[i]=s[a[0]-i]-'0';
        }
    }
    
    //逐位相加,并且进位
    void add(int a[],int b[]){
        //确定a数组和b数组位数的最大值,这样逐位相加做循环的时候好做
        a[0]=max(a[0],b[0]);
        //逐位相加
        for(int i=1;i<=a[0];i++){
            a[i]+=b[i];
        }
        //处理进位
        for(int i=1;i<=a[0];i++){
            if(a[i]/10) a[i+1]+=a[i]/10;
            a[i]%=10;
        }
        //最高位进位的话,要将数字的长度加1
        if(a[a[0]+1]) a[0]++;
    }
    
    //反向输出数组
    void print(int a[]){
        for(int i=a[0];i>=1;i--){
            cout<<a[i];
        }
        cout<<endl;
    }
    
    int main(){
        string sa,sb;
        cin>>sa;
        cin>>sb;
        init(sa,a);
        init(sb,b);
        add(a,b);
        print(a);
        return 0;
    }

    2、高精度加法中,为什么要将数字字符串反向转换成数组?

    为了方便加法从低位逐位相加

    3、做高精度加法的时候,注意点是什么?

    a、字符串转成数组的时候,我们需要反转,这样方便逐位相加
    b、输出的时候也要反转回来

    二、高精度加法

    博客对应课程的视频位置:3、高精度加法
    https://www.fanrenyi.com/video/30/283

    学过编程的大家一定对int long 不陌生吧,
    那么自然是知道它们各自能表达的数范围,
    比如int能表示范围为2^32,这看起来很大,
    但在在实际的应用中,比如求幂,比如求阶乘等运算,
    不说是int 哪怕是long long也是不够的,尤其是在一些算法题中,
    那么为了使用或计算这些超出或远超整形大小的数,
    我们就可以用高精度来做

    高精度是一系列的算法,比如加法、减法、乘法、除法等

    比如我们计算

    797879787978943797398473475345439743874397433434434978798789

    +

    897238972397398271927987298793532342454374937493343434347493749733434

    输入的话,就用字符串,这样输入多少位都行
    但是计算的时候,我们可以用数组,数组中的每一位存储一个数字,相加就逐位相加,然后进位就好

     1 /*
     2 
     3 高精度加法注意:
     4 比如我们计算
     5 797879787978943797398473475345439743874397433434434978798789
     6 +
     7 897238972397398271927987298793532342454374937493343434347493749733434
     8 
     9 a、字符串转成数组的时候,我们需要反转,这样方便逐位相加
    10 b、输出的时候也要反转回来
    11 
    12 
    13 高精度加法原理:
    14 输入的话,就用字符串,这样输入多少位都行
    15 但是计算的时候,我们可以用数组,
    16 数组中的每一位存储一个数字,
    17 相加就逐位相加,然后进位就好
    18 
    19 
    20 思路:
    21 init
    22 字符串反向转成数组
    23 add
    24 逐位相加,并且进位
    25 print
    26 反向输出数组
    27 
    28 
    29 字符串反向转成数组
    30 98765
    31 
    32 s[4]=a[1]
    33 s[3]=a[2]
    34 
    35 56798
    36 
    37 
    38 */
    39 #include <iostream>
    40 #include <algorithm>
    41 using namespace std;
    42 int a[1000]={0},b[1000]={0};
    43 
    44 //字符串反向转成数组
    45 void init(string s,int a[]){
    46     //我们把字符串的长度,也就是数字的位数,存在a[0]
    47     a[0]=s.length();
    48     //字符串反向转成数组
    49     for(int i=1;i<=a[0];i++){
    50         a[i]=s[a[0]-i]-'0';
    51     }
    52 }
    53 
    54 //逐位相加,并且进位
    55 void add(int a[],int b[]){
    56     //确定a数组和b数组位数的最大值,这样逐位相加做循环的时候好做
    57     a[0]=max(a[0],b[0]);
    58     //逐位相加
    59     for(int i=1;i<=a[0];i++){
    60         a[i]+=b[i];
    61     }
    62     //处理进位
    63     for(int i=1;i<=a[0];i++){
    64         if(a[i]/10) a[i+1]+=a[i]/10;
    65         a[i]%=10;
    66     }
    67     //最高位进位的话,要将数字的长度加1
    68     if(a[a[0]+1]) a[0]++;
    69 }
    70 
    71 //反向输出数组
    72 void print(int a[]){
    73     for(int i=a[0];i>=1;i--){
    74         cout<<a[i];
    75     }
    76     cout<<endl;
    77 }
    78 
    79 int main(){
    80     string sa,sb;
    81     cin>>sa;
    82     cin>>sb;
    83     init(sa,a);
    84     init(sb,b);
    85     add(a,b);
    86     print(a);
    87     return 0;
    88 }
     
  • 相关阅读:
    LIstView相关问题总结
    Fragment相关总结
    HandlerThread相关问题总结
    webView相关总结
    Broadcast相关问题总结
    Android事件分发机制
    Service相关总结
    AsyncTask问题总结
    HTML常见的文本语义标签
    C++ const小结
  • 原文地址:https://www.cnblogs.com/Renyi-Fan/p/13066540.html
Copyright © 2020-2023  润新知