题解 P1601 【A+B Problem(高精)】 P1601 A+B Problem(高精)

题目描述

高精度加法,x相当于a+b problem,b不用考虑负数。

输入输出格式

输入格式:

分两行输入a,b<=10^500

输出格式:

输出只有一行,代表A+B的值

输入输出样例

输入样例: 
1
1
输出样例: 
2

比较简单的高精度。

高精度。顾名思义,就是在很大的位数情况下进行运算。(炸int)

其基本思想就是用数组进行模拟加法。

模拟近位。

最后遍历数组输出。

附代码:

 1 #include <cstdio>
 2 #include <iostream>
 3 using namespace std;
 4 
 5 struct diff{
 6     int len;short x[3005];
 7 
 8     void read(){
 9         int len_read;
10         string read;
11         cin>>read;
12         len=0;len_read=read.size();
13         for(int i=len_read-1;i>=0;i--)x[++len]=read[i]-48;
14     }
15 
16     void write(){
17         for(int i=len;i>=1;i--)printf("%d",x[i]);
18         printf("
");
19         return ;
20     }
21 
22     struct diff operator+(struct diff tmp){
23         int c=0;
24         struct diff ans;
25         ans.len=tmp.len;if(len>ans.len)ans.len=len;
26         for(int i=1;i<=ans.len;i++)
27         {
28             ans.x[i]=x[i]+tmp.x[i]+c;
29             c=ans.x[i]/10;ans.x[i]%=10;
30         }
31         if(c>0)ans.x[++ans.len]=c;
32         return ans;
33     }
34 }a,b;
35 
36 int main(){
37     a.read();b.read();a=a+b;a.write();
38     return 0;
39 }
View Code

我们每个人都应该做到精益求精,所以还可以将普通高精度升华一下

那就是传说中的万进制高精度:

 1 #include <iostream>
 2 #include <cstdio>
 3 using namespace std;
 4 string s1,s2;
 5 int c,len,len1,a[100005],len2,b[100005];
 6 
 7 void turn()
 8 {
 9     int x,y,lx=s1.size(),ly=s2.size(),l,r;
10     int c[100005],d[100005];
11     l=lx/4;r=ly/4;
12     x=lx-l*4;y=ly-r*4;
13     for(int i=0;i<x;i++)c[1]=c[1]*10+s1[i]-48;
14     for(int i=0;i<y;i++)d[1]=d[1]*10+s2[i]-48;
15     for(int i=2;i<=l+1;i++)c[i-(x==0)]=(s1[4*(i-2)+x]-48)*1000+(s1[4*(i-2)+x+1]-48)*100+(s1[4*(i-2)+x+2]-48)*10+(s1[4*(i-2)+x+3]-48);
16     for(int i=2;i<=r+1;i++)d[i-(y==0)]=(s2[4*(i-2)+y]-48)*1000+(s2[4*(i-2)+y+1]-48)*100+(s2[4*(i-2)+y+2]-48)*10+(s2[4*(i-2)+y+3]-48);
17     len1=l+(x>0);len2=r+(y>0);
18     for(int i=1;i<=len1;i++)a[i]=c[len1-i+1];
19     for(int i=1;i<=len2;i++)b[i]=d[len2-i+1];
20 
21 }
22 
23 int main()
24 {
25     cin>>s1>>s2;
26     turn();
27     len=len1;if(len2>len)len=len2;
28     for(int i=1;i<=len;i++)
29     {
30         a[i]=a[i]+b[i]+c;
31         c=a[i]/10000;
32         a[i]%=10000;
33     }
34     if(c>0)a[++len]=c;
35     printf("%d",a[len]);
36     for(int i=len-1;i>=1;i--)printf("%04d",a[i]);
37     return 0;/*万进制高精加*/
38 }
View Code

万进制高精加要注意输出“printf("%04d",a[i]);”

点个赞吧↓