2019HDU多校第七场 HDU6646 A + B = C 【模拟】

一、题目

  A + B = C

二、分析

  比较考验码力的题。

  对于$c$,因为首位肯定不为0,那么$a$或者$b$至少有一个最高位是和$c$平齐的,或者少一位(相当于$a$+$b$进位得到)。

  那么这里,我们可以分四种情况

  1 让$a$与$c$变为等长$A$和$C$

    等长后判断$R = C - A$是否等于$b$,这里的等实际上是${R}\times{10^{d1}}$与${b}\times{10^{d2}}$比较,$d1$和$d2$都可能为结果做出贡献。

  2 让$a$与$c$变为等长$A$和$C$,但$C$继续增长一位变为$C = {C}\times{10}$

    判断$R = C - A$是否等于$b$,后面同上。

  3 让$b$与$c$变为等长$B$和$C$

    同情况1

  4 让$b$与$c$变为等长$B$和$C$,但$C$继续增长一位变为$C = {C}\times{10}$

    同情况2

  然后就是紧张刺激的码代码了,细节很多,因为变量太多,该初始化的要初始化,特别是X,Y,Z的变化一定要即时增长。

三、AC代码

 

  1 #include <bits/stdc++.h>
  2 
  3 using namespace std;
  4 #define ll long long
  5 #define Min(a,b) ((a)>(b)?(b):(a))
  6 #define Max(a,b) ((a)>(b)?(a):(b))
  7 const int maxn = 1e5+13;
  8 char aa[maxn], bb[maxn], cc[maxn];
  9 int a[maxn], b[maxn], c[maxn];
 10 int lena, lenb, lenc;
 11 int la, lb, lc;
 12 int tx, ty, tz, deta1, deta2, deta3;
 13 
 14 void debug()
 15 {
 16     cout << " a ";
 17     for(int i = 0; i < la; i++)
 18         cout << a[i];
 19     cout << endl << " c ";
 20     for(int i = 0; i < lc; i++)
 21         cout << c[i];
 22     cout << endl;
 23 }
 24 
 25 // A - B == C
 26 bool check(int A[], int B[], int C[], int LA, int LB, int LC)
 27 {
 28     deta1 = deta2 = deta3 = 0;   //变化量
 29     if(A[0] < B[0])
 30         return false;
 31     int Res[maxn], L = LA;
 32     int pos = L - 1, tmp = 0;
 33     int i, j;
 34     for(i = LA - 1, j = LB - 1; i >= 0 && j >= 0; i--, j--, pos--)
 35     {
 36         A[i] -= tmp;
 37         tmp = 0;
 38         Res[pos] = A[i] - B[j];
 39         if(Res[pos] < 0)
 40         {
 41             tmp = 1;
 42             Res[pos] += 10;
 43         }
 44     }
 45     for(i; i >= 0; i--, pos--)
 46     {
 47         A[i] -= tmp;
 48         tmp = 0;
 49         Res[pos] = A[i];
 50         if(Res[pos] < 0)
 51         {
 52             tmp = 1;
 53             Res[pos] += 10;
 54         }
 55     }
 56     if(tmp > 0)
 57         return false;
 58     // 判断 Res  == C * 10^deta
 59     //  或者 Res * 10 ^ deta = C
 60     for(i = 0; i < L; i++)
 61     {
 62         if(Res[i] != 0)
 63             break;
 64     }
 65     for(j = 0; j < LC && i < L; j++, i++)
 66     {
 67         if(Res[i] != C[j])
 68             return false;
 69     }
 70     while(i < L)
 71     {
 72         if(Res[i] != 0)
 73             return false;
 74         deta3++;
 75         i++;
 76     }
 77     while(j < LC)
 78     {
 79         if(C[j] != 0)
 80             return false;
 81         deta1++;
 82         j++;
 83     }
 84     deta2 = deta1;
 85     // cout << "Res : "; 
 86     // for(i = 0; i < L; i++)
 87     //     cout << Res[i];
 88     // cout << endl << "C : ";
 89     // for(i = 0; i < LC; i++)
 90     //     cout << C[i];
 91     // cout << endl;
 92     return true;
 93 }
 94 
 95 void init1()
 96 {
 97     tx = 0, ty = 0, tz = 0;
 98     for(int i = 0; i < lena; i++)
 99         a[i] = aa[i] - '0';
100     for(int i = 0; i < lenb; i++)
101         b[i] = bb[i] - '0';
102     for(int i = 0; i < lenc; i++)
103         c[i] = cc[i] - '0';
104     la = lena, lb = lenb, lc = lenc;
105     if(la > lc)
106     {
107         lc = la;
108         tz += (lc - lenc);
109         for(int i = lenc; i < lc; i++)
110         {
111             c[i] = 0;
112         }
113     }
114     else if(la < lc)
115     {
116         la = lc;
117         tx += (la - lena);
118         for(int i = lena; i < la; i++)
119         {
120             a[i] = 0;
121         }
122     }
123     //cout << "tx : " << tx << " ty : " << ty << " tz : " << tz << endl;
124 }
125 void init2()
126 {
127     tx = 0, ty = 0, tz = 0;
128     for(int i = 0; i < lena; i++)
129         a[i] = aa[i] - '0';
130     for(int i = 0; i < lenb; i++)
131         b[i] = bb[i] - '0';
132     for(int i = 0; i < lenc; i++)
133         c[i] = cc[i] - '0';
134     la = lena, lb = lenb, lc = lenc;
135     if(lb > lc)
136     {
137         lc = lb;
138         tz += lc - lenc;
139         for(int i = lenc; i < lc; i++)
140         {
141             c[i] = 0;
142         }
143     }
144     else if(lb < lc)
145     {
146         lb = lc;
147         ty += lb - lenb;
148         for(int i = lenb; i < lb; i++)
149         {
150             b[i] = 0;
151         }
152     }
153 }
154 
155 int main()
156 {
157     //freopen("input.txt", "r", stdin);
158     //freopen("out.txt", "w", stdout);
159     int T;
160     scanf("%d", &T);
161     while(T--)
162     {
163         scanf("%s%s%s", aa, bb, cc);
164         lena = strlen(aa);
165         lenb = strlen(bb);
166         lenc = strlen(cc);
167         init1();
168         //c - a == b
169         if(check(c, a, b, lc, la, lb))
170         {
171             // cout << " c - a ?= b " << deta << endl;
172             tx += deta2, ty += deta3, tz += deta1;
173             printf("%d %d %d\n", tx, ty, tz);
174             continue;
175         }
176         init1();
177         //c*10 - a == b
178         c[lc++] = 0;
179         tz++;
180         if(check(c, a, b, lc, la, lb))
181         {
182             // cout << " c*10 - a ?= b" << endl;
183             tx += deta2, ty += deta3, tz += deta1;
184             printf("%d %d %d\n", tx, ty, tz);
185             continue;
186         }
187         init2();
188         //c - b == a
189         if(check(c, b, a, lc, lb, la))
190         {
191             // cout << " c - b ?= a" << endl;
192             tx += deta3, ty += deta2, tz += deta1;
193             printf("%d %d %d\n", tx, ty, tz);
194             continue;
195         }
196         init2();
197         //c*10 - b == a
198         c[lc++] = 0;
199         tz++;
200         if(check(c, b, a, lc, lb, la))
201         {
202             // cout << " c*10 - b ?= a" << endl;
203             tx += deta3, ty += deta2, tz += deta1;
204             printf("%d %d %d\n", tx, ty, tz);
205             continue;
206         }
207         puts("-1");
208     }
209     return 0;
210 }

 

转载于:https://www.cnblogs.com/dybala21/p/11347189.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值