高精度加法
程序员文章站
2022-07-14 23:37:16
...
背景:
我们为什么要研究高精度加法?
因为普通的变量存不下我们的计算结果,也存不下我们的加数和被加数
思路:
我们如何做呢?来一起分析一下
我们知道我们人类手工计算大数相加时我们也不可能直接计算出来,我们是先将两个数写下来,在逐位相加,最后得到相加的结果,
既然计算机模仿人,那么我们可以用数组存储每位数字
然后…写不下去了,直接上代码233,代码很详细
#include<iostream>
#include<cstring>
#define size 9999
using namespace std;
//1.存储大数
//2.大数相加
//3.输出结果
int main() {
int t;
cin>>t;
while(t--) {
//存储大数
int a[size]= {0},b[size]= {0},c[size]= {0};
string A,B;
cin>>A;
cin>>B;
int len_a=A.length(),len_b=B.length();
//将字符串A中存放的字符转为数字逆序存储在a数组中,
for(int i=0; i<len_a; i++) {
a[i]=(A[(len_a-1)-i]-'0');
}
//B->b[]
for(int i=0; i<len_b; i++) {
b[i]=(B[(len_b-1)-i]-'0');
}
//相加操作
//判断结果的长度
int len_c=(len_a>len_b)?len_a:len_b;
int p,flag=0;
for(int i=0; i<len_c; i++) {
p=a[i]+b[i]+flag;
if(i==len_c-1&&p>=10)//如果结果的最高位>=10则,len_c+1
len_c+=1;
if(p>=10) {
c[i]=p%10;
flag=1;//保存进位
} else {
flag=0;
c[i]=p;
}
}
//逆序输出结果
for(int i=len_c-1; i>=0; i--) {//将len_c的长度需要判断更加严格,将00222等的结果的零除去,就是如果结果开头为零,就将开头的零除去
if(c[i]==0&&c[i-1]==0||c[i]==0&&c[i-1]!=0) {
len_c--;
}
if(c[i]!=0) {
break;
}
}
for(int i=len_c-1; i>=0; i--) {//逆序输出结果
cout<<c[i];
}
cout<<endl;
}
return 0;
}
上一篇: 大数乘法(二进制)