【最蔡版】高精度A+B

【引子】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;
}

  

#include<bits/stdc++.h>
using namespace std;
int a,b;
int c[100005];
void add(int x,int y)
{
    while(x<=a+b) c[x]+=y,x+=x&-x;
}
int ask(int x)
{
    int ans=0;
    while(x) ans+=c[x],x-=x&-x;
    return ans;
}
int main()
{
    scanf("%d%d",&a,&b);
    for(int i=1;i<=a+b;i++) add(i,1);
    printf("%d",ask(a)+ask(b));
    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;
}

  

 

posted @ 2019-08-06 15:46  轩辕东升  阅读(299)  评论(1编辑  收藏  举报