P1601 A+B Problem(高精)

吐槽

自己亲手做出来最难的模拟题,花费了好久。

分析

10500大小的数据,肯定不能用正常的数据,因此只能用数组来存放每一位数字。

接着是将数据位数对齐,对于位数小的,前面补零(位数相同直接加)

然后相加就ok

最最最难得就是相加部分(从后往前加)

先考虑进位问题。设置标志判断是否进位,当下一位之和大于9(一定是9!!!)时,标志设true,否则设false。

然后根据标志判断是否当前数加一

还有容易忽视的就是,当轮到首位,又要进位时,直接输出1。

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 char a[500],b[500];
 4 int ans[500]={0};
 5 void add(char *a,char *b,int length){
 6     bool flag=false;
 7     for(int i=length-1;i>=0;i--){
 8         int temp=(int)(a[i]-'0')+(int)(b[i]-'0');
 9         if(flag){
10             temp++;
11         }
12         if(i==0&&temp>9){
13             cout<<1;
14         }
15         if(temp<10){
16             ans[i]=temp;
17             flag=false;
18         }else{
19             ans[i]=temp%10;
20             flag=true;
21         }
22     }
23     for(int i=0;i<length;i++){
24         cout<<ans[i];
25     }
26 }
27 int main()
28 {
29     cin>>a;
30     cin>>b;
31     int a_length=strlen(a),b_length=strlen(b);
32     char min_char=a_length<b_length?'a':'b';
33     int d=abs(a_length-b_length);
34     if(d==0){
35         add(a,b,a_length);
36         return 0;
37     }
38     if(min_char=='a'){
39         char plus[500];
40         for(int i=0;i<b_length;i++){
41             if(i<d){
42                 plus[i]='0';
43             }
44             else{
45                 plus[i]=a[i-d];
46             }
47         }
48         add(plus,b,b_length);
49     }
50     else{
51         char plus[500];
52         for(int i=0;i<a_length;i++){
53             if(i<d){
54                 plus[i]='0';
55             }
56             else{
57                 plus[i]=b[i-d];
58             }
59         }
60         add(plus,a,a_length);
61     }
62     return 0;
63 }

 

上一篇:Ts面向对象


下一篇:Suricata6.0流表管理源码注释六:流的老化02