高精度数不进位加法
谈及数字即可想到运算,那么高精度数怎么运算呢?今天来系统介绍一下高精度数的加法。
思考一下加法运算,我们可以简单将加法运算这样区分:
- 有无进位。
- 位数是否相同。
这篇文章我们就来讨论一下无进位的高精度数计算。
相同位数无进位加法
这类的相对比较简单,我们只需要指定位数相加,然后正常顺序输出即可。
#include <iostream>
#include <cstring>
using namespace std;
int main() {
char a[1001] = {}, b[1001] = {}; // 定义字符数组存储输入的两个高精度数
int a1[1001] = {}, b1[1001] = {}, c1[1001] = {}; // 定义整数数组用于存储转换后的高精度数及其和
cin >> a >> b; // 输入两个高精度数
int len = strlen(a); // 获取第一个高精度数的长度
for(int i = 0; i < len; i++) {
a1[i] = a[i] - '0'; // 将字符类型的数字转换为整数存储到a1数组中
b1[i] = b[i] - '0'; // 将字符类型的数字转换为整数存储到b1数组中
c1[i] = a1[i] + b1[i]; // 计算两个高精度数的对应位相加的和存储到c1数组中
}
for(int i = 0; i < len; i++) {
cout << c1[i]; // 输出计算得到的高精度数的和
}
return 0;
}
不同位数无进位加法
问题来了,位数不同,如何完成加法呢?
我们拿出两个数举例:
例如:
321321321321 + 4564563
转换成数组以后,[0]位对齐,这时相加的结果并不是我们想要的 ,
毕竟我们做竖式运算时,是末尾对齐。
那要如何计算出正确答案呢?
1.将两个数组全都翻转。
2.翻转后[0]位对齐相加。
3.将翻转结果输出,即为我们想要的结果。
代码为:
char a[1001]={},b[1001]={};
int a1[1001]={},b1[1001]={},c1[1001]={};
cin>>a>>b;
int lena=strlen(a),lenb=strlen(b);
int len=(lena>lenb?lena:lenb);//取较长数字的位数作为总位数
for(int i=0;i<lena;i++){
a1[i]=a[lena-1-i]-48;//将两个加数逆序转换成int型的数字
}
for(int i=0;i<lenb;i++){
b1[i]=b[lenb-1-i]-48;//将两个加数逆序转换成int型的数字
}
for(int i=0;i<len;i++){
c1[i]=b1[i]+a1[i];//对应位相加
}
for(int i=0;i<len;i++){
cout<<c1[len-1-i];//将相加的和倒序输出
}