2127:【例1.2】高精度加法 && 高精度计算
【题目描述】
求两个不超过100位的非负整数的和。
【输入】
有两行,每行是一个不超过100位的非负整数。
【输出】
一行,即相加后的结果。
【输入样例】
22222222222222222222
33333333333333333333
【输出样例】
55555555555555555555
#include<iostream>
using namespace std;
const int N =1e6 ;
int a[N],b[N],c[N];
int la,la1,la2;
int main()
{
string s,p;
cin >>s>>p;
la = s.size();
la1=p.size();
//拆分每一位,逆序存放在数组
for (int i = 0; i < la; i++)
{
a[la - 1 - i] = s[i] - '0';
}
for (int i = 0; i < la1; i++)
{
b[la1 - 1 - i] = p[i] - '0';
}
int jinwei=0,temp=0;//temp记录有多少位
for(int i=0;i<max(la,la1)||jinwei>0;i++)
{
int sum=jinwei;//下一个循环sum有的进位的数与原本要加的数加。
if(i<la) sum+=a[i];
if(i<la1) sum+=b[i];//逐位相加
c[temp++]=sum%10;//取两位数相加的余数,17%20==7;
jinwei=sum/10;//取进位后的数,
}
for (int i=temp-1;i>=0;--i)
{
cout <<c[i];//再逆序输出
}
return 0;
}
高精度计算因为范围太大,要用string以字符形式存储,然后转为整数数组类型逐位相加,在string和int a【n】中由于数相加通常由个位到高位依次加和,由于使用的循环原因,要从0开始代表个位,原string中0位置为高位,查找规律发现,在string和逆序的a【】中分别用下标从0开始标记,得出相同数字下标加和-1为一个固定数,于是
for (int i = 0; i < la; i++) { a[la - 1 - i] = s[i] - '0';//减‘0’因为s为字符型。减i是为了移动,对应在数组中的下标位置就是ls(设置一个长度变量)减1再减i }
参考hauiz博主。

浙公网安备 33010602011771号