【引子】A+B的神奇解法(更多神奇解法请点击此处获取):
#include<bits/stdc++.h>
using namespace std;
#define i int a,b;
#define ak cin>>a>>b;
#define ioi cout<<a+b;
int main(){i ak ioi}
#include<bits/stdc++.h>
using namespace std;
int dp[1005][1005];
int main()
{
int a,b;
cin>>a>>b;
dp[0][1]=a,dp[1][0]=b;
for(int i=1;i<=1000;i++)
{
for(int j=1;j<=1000;j++) dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
cout<<dp[1][1];
return 0;
}
今天,我们介绍一下高精度A+B。所谓“高精度”,即指超过(unsigned)long long范围的运算。这样的整数无法在32位的计算机上使用任何数据类型存储,这时我们就需要把整数当做字符串来存储。
将数据存入字符串后,然后将个位对齐,这时就可以模拟竖式运算进行加法了,注意进位的问题。减法的方法类似。
#include<bits/stdc++.h>
using namespace std;
char a[505],b[505];
char A[505],B[505],ans[505];
int main()
{
cin>>a+1>>b+1;//输入
int la=strlen(a+1),lb=strlen(b+1);
for(int i=1;i<=la;i++) A[i]=a[la-i+1]-'0';
for(int i=1;i<=lb;i++) B[i]=b[lb-i+1]-'0';//颠倒顺序,使两个加数个位对齐
for(int i=1;i<=max(la,lb);i++)
{
ans[i]+=A[i]+B[i];//逐位相加,注意是+=而不是=,因为有进位
if(ans[i]>=10) ans[i]-=10,ans[i+1]++;//进位的操作
}
bool xyds=0;//寻找第一个有有效数字(大于0)的数位
for(int i=500;i>=1;i--)//按数位从高到低输出
{
if(ans[i]) xyds=1;
if(xyds) putchar(ans[i]+'0');//输出
}
if(!xyds) putchar('0');//若和为0,则特判一番
return 0;
}