一、题目

  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 }

最新文章

  1. Nginx密码验证 ngx_http_auth_basic_module模块
  2. Redis常用命令汇总
  3. 内核移植和文件系统制作(3)Ramdisk简介和常见问题
  4. ecshop设置一个子类对应多个父类并指定跳转url的修改方法
  5. hdu 4381(背包变形)
  6. Project Euler 79:Passcode derivation
  7. 《Nagios系统监控实践》一书出版
  8. spoj 104 Highways (最小生成树计数)
  9. Linux下检测内存泄露的工具 valgrind
  10. C语言--static修饰函数
  11. (转载)解决NVIDIA显卡驱动“没有找到兼容的图形硬件”的问题
  12. Intellij IDEA使用Docker插件部署应用
  13. nodejs小问题拾遗
  14. PHP filemtime() 函数
  15. 22.OGNL与ValueStack(VS)-默认类Math的访问
  16. mybatis后台中传参到sql语句中,使用@Param注解
  17. VS2017桌面应用程序打包成.msi或者.exe
  18. Django修改用户名密码的方法
  19. javascript的优缺点和内置对象
  20. Cisco 路由交换 常用查询语句

热门文章

  1. 4.安装fluentd用于收集集群内部应用日志
  2. (20002, b&#39;DB-Lib error message 20002, severity 9:\nAdaptive Server connection failed (127.0.0.1:3306)\n&#39;)
  3. Volatile如何保证线程可见性之总线锁、缓存一致性协议
  4. Python_K-means算法
  5. Linux bash fi
  6. js logical operation all in one
  7. DevOps in Action
  8. js clear copy
  9. Spring 中的 MetaData 接口
  10. 【转】奇异值分解(SVD)原理详解及推导