【最蔡版】高精度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; }