一、总结
一句话总结:
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 }