想学习高精度实现原理和其他知识点这里
原理:模拟竖式加法
将a数组和b数组倒序存放(考虑到进位问题),模拟竖式加法,依次相加到c数组中,去除前导零,最后倒序输出c数组(即结果)。
![](https://img-blog.csdnimg.cn/img_convert/ee370056ef44d473dffa9ed886b90b22.png)
实例解析
以1234+5678为例
![](https://img-blog.csdnimg.cn/img_convert/3b93ab9254b44656528ab71ac0eaa8c9.png)
开始相加到c数组中
![](https://img-blog.csdnimg.cn/img_convert/d49540edfe4688842a22c8dce35b181a.png)
个位写2进1,十位相加
![](https://img-blog.csdnimg.cn/img_convert/e3f9a03e56440bead5d3a4a572179ebf.png)
十位写0进1,再加上进位,一共是1
![](https://img-blog.csdnimg.cn/img_convert/307a906ea9a51e604715140764774bc5.png)
百位写8,加上进位,一共是9
![](https://img-blog.csdnimg.cn/img_convert/010216c5f1ef0431804c3cc53c28e639.png)
千位写6,计算结束,c数组倒过来就是
![](https://img-blog.csdnimg.cn/img_convert/1163c2ae81c35ba09495057767458952.png)
至此,高精度加法完成。
代码实现
C语言风格版
#include<cstdio>
#include<cstring>
#include<algorithm>
//定义数组和字符串
#define MAX 1010
int a[MAX],b[MAX],c[MAX];
char s1[MAX],s2[MAX];
int main(){
scanf("%s %s",s1,s2);
//倒序存储,c的长度是a长度+b长度+1(进位)
int len1=strlen(s1),len2=strlen(s2),len3=std::max(len1,len2)+1;
for(int i=0;i<len1;i++) a[len1-i-1]=s1[i]-'0';
for(int i=0;i<len2;i++) b[len2-i-1]=s2[i]-'0'; //别忘了把字符转成数字
int jw=0; //设置进位变量
for(int i=0;i<len3;i++){
c[i]=a[i]+b[i]+jw;
jw=c[i]/10,c[i]%=10; //jw取c[i]的十位,%10是取个位
}
while(c[len3-1]==0&&len3>1) len3--; //去除前导0,len3>1是因为如果结果0的话会全减去
for(int i=len3-1;i>=0;i--) printf("%d",c[i]); //倒序输出
return 0;
}
string字符串版
#include<iostream>
#include<string>
using namespace std;
//定义数组和字符串
const int MAX=1010;
int a[MAX],b[MAX],c[MAX];
string s1,s2;
int main(){
cin>>s1>>s2;
//倒序存储,c的长度是a长度+b长度+1(进位)
int len1=s1.size(),len2=s2.size(),len3=max(len1,len2)+1;
for(int i=0;i<len1;i++) a[len1-i-1]=s1[i]-'0';
for(int i=0;i<len2;i++) b[len2-i-1]=s2[i]-'0'; //别忘了把字符转成数字
int jw=0; //设置进位变量
for(int i=0;i<len3;i++){
c[i]=a[i]+b[i]+jw;
jw=c[i]/10,c[i]%=10; //jw取c[i]的十位,%10是取个位
}
while(c[len3-1]==0&&len3>1) len3--; //去除前导0,len3>1是因为如果结果0的话会得到空字符串
for(int i=len3-1;i>=0;i--) cout<<c[i]; //倒序输出
return 0;
}
强迫症专用
#include <cstdio>
#include <cstring>
#include <algorithm> //max函数要用
//定义数组和字符串
#define MAX 1010;
int a[MAX], b[MAX], c[MAX];
char s1[MAX], s2[MAX];
int main() {
scanf("%s %s", s1, s2);
//倒序存储,c的长度是a长度+b长度+1(进位)
int len1 = strlen(s1), len2 = strlen(s2), len3 = std::max(len1, len2) + 1;
for (int i = 0; i < len1; i++) a[len1 - i - 1] = s1[i] - '0';
for (int i = 0; i < len2; i++) b[len2 - i - 1] = s2[i] - '0'; //别忘了把字符转成数字
int jw = 0; //设置进位变量
for (int i = 0; i < len3; i++) {
c[i] = a[i] + b[i] + jw;
jw = c[i] / 10, c[i] %= 10; //jw取c[i]的十位,%10是取个位
}
while (c[len3 - 1] == 0 && len3 > 1) len3--; //去除前导0,len3>1是因为如果结果0的话会全减去
for (int i = len3 - 1; i >= 0; i--) printf("%d", c[i]); //倒序输出
return 0;
}
#include <iostream>
#include <string>
using namespace std;
//定义数组和字符串
const int MAX = 1010;
int a[MAX], b[MAX], c[MAX];
string s1, s2;
int main() {
cin >> s1 >> s2;
//倒序存储,c的长度是a长度+b长度+1(进位)
int len1 = s1.size(), len2 = s2.size(), len3 = max(len1, len2) + 1;
for (int i = 0; i < len1; i++) a[len1 - i - 1] = s1[i] - '0';
for (int i = 0; i < len2; i++) b[len2 - i - 1] = s2[i] - '0'; //别忘了把字符转成数字
int jw = 0; //设置进位变量
for (int i = 0; i < len3; i++) {
c[i] = a[i] + b[i] + jw;
jw = c[i] / 10, c[i] %= 10; //jw取c[i]的十位,%10是取个位
}
while (c[len3 - 1] == 0 && len3 > 1) len3--; //去除前导0,len3>1是因为如果结果0的话会全减去
for (int i = len3 - 1; i >= 0; i--) cout << c[i]; //倒序输出
return 0;
}
小结
C++的高精度是算法竞赛的必修课程,希望大家一定要理解方法、熟练掌握、扎实运用,也可以稍有改进,这样你就离大牛又进了一步!
掰掰ヾ(•ω•`)o
本文可以转载,但请注明作者,谢谢