众所周知,c++对数据类型的定义十分严谨,以下是整型数据类型一览表
数据结构 | 占用空间大小 |
short | 16 位 |
int | 16 位 |
long | 32 位 |
long long | 64 位 |
其中最大的long long只能表示±2^63-1的数,那么超出的部分如何运算。比如洛谷的P1601题。
题目描述
高精度加法,相当于 a+b problem,不用考虑负数。
输入格式
分两行输入 a,b≤
。
输出格式
输出只有一行,代表 a+b 的值。
对于这道题我们需要用到高精度模拟算法,即模拟小学一年级就学会的竖式
思路:用字符数组存储数字,在逐个相加,最后进位
算法实现
将数字存入数组
我们可以输入字符串,再把字符串逐个减去字符‘0’,就能将字符串中的数存入
string s1,s2;
getline(cin,s1);
getline(cin,s2);
for(int i=0;i<s1.size();i++)
{
a1[s1.size()-i-1]=s1[i]-'0';
}
for(int i=0;i<s2.size();i++)
{
a2[s2.size()-i-1]=s2[i]-'0';
}
逐位相加
遍历数组循环相加,存入数组a3,问题是要循环多少次,大家可以进行投票。
答案上最长字符串
int len=max(s1.size(),s2.size());
for(int i=0;i<len;i++)
{
a3[i]=a1[i]+a2[i];
}
进位
最后是进位,大于十要进位
for(int i=0;i<len;i++)
{
if(a3[i]>=10)
{
a3[i+1]=a3[i+1]+a3[i]/10;
a3[i]=a3[i]%10;
}
}
输出
最后只要倒序输出即可
想一想要输出多少位数,第一两个数相加无论数字多大结果只能是最大数字的位数+1,所以我们进行判断,如果a3[len+1]=0那么len++;
if(a3[len]!=0) len++;
for(int i=len-1;i>=0;i--)
{
cout<<a3[i];
}
最后是你们喜闻乐见的源代码
#include<bits/stdc++.h>
using namespace std;
const int size=501;
int a1[size],a2[size],a3[size];
int main()
{
string s1,s2;
getline(cin,s1);
getline(cin,s2);
for(int i=0;i<s1.size();i++)
{
a1[s1.size()-i-1]=s1[i]-'0';
}
for(int i=0;i<s2.size();i++)
{
a2[s2.size()-i-1]=s2[i]-'0';
}
int len=max(s1.size(),s2.size());
for(int i=0;i<len;i++)
{
a3[i]=a1[i]+a2[i];
}
for(int i=0;i<len;i++)
{
if(a3[i]>=10)
{
a3[i+1]=a3[i+1]+a3[i]/10;
a3[i]=a3[i]%10;
}
}
if(a3[len]!=0) len++;
for(int i=len-1;i>=0;i--)
{
cout<<a3[i];
}
}
切记请勿抄袭,不然你的洛谷账号就灰了。