今天来给大家讲高精度加法
不过呢在一切之前先给大家上题目
题目描述
给出两个整数a,b;求他们的和。
a,b的位数不超过300位。
输入格式
第一行一个整数a
第二行一个整数b
输出格式
输出只有一行,为两个整数的和。
样例
样例输入
101000000000000
203000000000000
样例输出
304000000000000
好 那么大家读完题目后应该看到了 这个范围long long实存不下的 所以我们必须采用算法——高精度
下面先给大家介绍一下高精度
相信大家都知道 c++里面并不是所有数据都存的下的 所以有些时候我们必须换一种方法来进行这些数字太大的数字的运算
那么 第一个迎面而来的问题就是我们该如何存储这个数
思路1:运用整形数组来储存,但是这就存在一个很大的问题 那就是输入的时候是无法直接输入整形数组的 我们只能运用一个元素一个元素的读入 但是这些数字中间没有空格 所以很显然这样读入是无法做到的
思路2:运用字符型数组来储存。那么很显然 字符数组是可以整个整个的读入的 所以我们可以运用char型数组运用cin scanf gets等函数来直接输入高精度数
为了方便呢 我们一般运用字符数组输入之后我们就会将它转换为整形数组 这样便于计算。
好了那我们回到这道题 我们要做的是加法运算
那么很显然 我们知道了每一位上的数字,那就可以直接运用竖式运算法则 来计算高精度的加法运算
即每当每位加起来的数大于10,则我们要满十进一,将这个数减去10 然后再将前一位加上1,,这样就完了。
好 那么讲完了思路,我们就上代码
#include<bits/stdc++.h>//万能头文件
using namespace std;
int ans[5005];//存储输出结果的整形数组
char x[5005],y[5005];//原来输入的字符数组
int len3;//存储最后计算出来的那个数的位数
void num(char a[],int b[])//运用这个函数将字符数组转化为整形数组 将参数传入到b数组中
{
int x1=strlen(a);//取这个字符数组的长度
for(int i=0;i<x1;++i)
{
b[x1-i]=a[i]-'0';//这里尽量倒叙转过来 因为加法我们是从最后一位开始的
}
}
void print(int len,int num[])//这里是输出函数
{
while(len3>=1)//这里要倒序输出 因为我们的最前面一位是最后一位
{
cout<<ans[len3];//这是一个数 不需要打空格
len3--;
}
}
void bignum(char a[],char b[])
{
int len1=strlen(a),len2=strlen(b);
int l1[5005],l2[5005];
memset(l1,0,sizeof(l1));//赋个值 以免出现差错
memset(l2,0,sizeof(l2));
num(a,l1);//调用函数 直接转化为整形
num(b,l2);
while(len3<=len1||len3<=len2)//在枚举的位数小于等于他们的最大值时 继续做竖式加法
{
ans[len3]+=l1[len3]+l2[len3];//先加起来
ans[len3+1]=ans[len3]/10;//后一位进ans[len3]除以10
ans[len3]%=10;//无论进不进位 %10都没有影响
len3++;//进入下一位
}
if(ans[len3]==0)//判断第一位是不是0,是的话len3也就是这个数的位数-1
len3--;
print(len3-1,ans);//调用输出函数
}
int main()
{
cin>>x>>y;//输入两个字符数组
bignum(x,y);//直接调用函数
return 0;//养成返回0的好习惯
}