算法疑难(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

 

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

 

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

 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 }

 

 

 

 

 
我的旨在学过的东西不再忘记(主要使用艾宾浩斯遗忘曲线算法及其它智能学习复习算法)的偏公益性质的完全免费的编程视频学习网站: fanrenyi.com;有各种前端、后端、算法、大数据、人工智能等课程。
版权申明:欢迎转载,但请注明出处
一些博文中有一些参考内容因时间久远找不到来源了没有注明,如果侵权请联系我删除。
博主25岁,前端后端算法大数据人工智能都有兴趣。
大家有啥都可以加博主联系方式(qq404006308,微信fan404006308)互相交流。工作、生活、心境,可以互相启迪。
聊技术,交朋友,修心境,qq404006308,微信fan404006308
26岁,真心找女朋友,非诚勿扰,微信fan404006308,qq404006308
人工智能群:939687837

作者相关推荐