fork download
  1. #include <stdio.h>
  2. #include <string.h>
  3. char A[100005], B[100005];
  4. int main(void)
  5. {
  6. int le1, le2, len1, len2, i, j, check = 0, c;
  7. scanf("%s %s", A, B);
  8.  
  9. if (A[0] == '-')
  10. {
  11. if (B[0] == '-')//A, B 모두 음수
  12. {
  13. len1 = le1 = strlen(A) - 1;
  14. len2 = le2 = strlen(B) - 1;
  15. for (i = 0; i < le1; i++)
  16. A[i + 1] -= 48;
  17. for (i = 0; i < le2; i++)
  18. B[i + 1] -= 48;
  19. if (len1 >= len2)//A가 B보다 길이가 길거나 같은 경우
  20. {
  21. for (i = 0; i < len2; i++)
  22. {
  23. A[le1 - i] = A[le1 - i] + B[le2 - i];
  24. if (A[le1 - i] >= 10)
  25. {
  26. if (le1 - i == 1)
  27. continue;
  28. else
  29. {
  30. c = A[le1 - i] / 10;
  31. A[le1 - i] -= c * 10;
  32. A[le1 - i - 1] += c;
  33. }
  34. }
  35. }
  36. for (; i < len1; i++)//해당 루프는 만약 직전 줄까지의 코드에서 마지막으로 더해진 두 수가 10인 경우를 계산하기 위한 코드입니다.
  37. {
  38. if (A[le1 - i] >= 10)
  39. {
  40. if (le1 - i == 1)
  41. continue;
  42. else
  43. {
  44. c = A[le1 - i] / 10;
  45. A[le1 - i] -= c * 10;
  46. A[le1 - i - 1] += c;
  47. }
  48. }
  49. }
  50. printf("-");
  51. for (i = 1; i <= le1; i++)
  52. printf("%d", A[i]);
  53. printf("\n");
  54. }
  55. else//A가 B보다 길이가 짧은 경우(A, B모두 음수)
  56. {
  57. for (i = 0; i < len1; i++)
  58. {
  59. B[le2 - i] = B[le2 - i] + A[le1 - i];
  60. if (B[le2 - i] >= 10)
  61. {
  62. if (le2 - i == 1)
  63. continue;
  64. else
  65. {
  66. c = B[le2 - i] / 10;
  67. B[le2 - i] -= c * 10;
  68. B[le2 - i - 1] += c;
  69. }
  70. }
  71. }
  72. for (; i < len2; i++)//직전까지의 줄에서 마지막 합이 10인 경우입니다.
  73. {
  74. if (B[le2 - i] >= 10)
  75. {
  76. if (le2 - i == 1)
  77. continue;
  78. else
  79. {
  80. c = B[le2 - i] / 10;
  81. B[le2 - i] -= c * 10;
  82. B[le2 - i - 1] += c;
  83. }
  84. }
  85. }
  86. printf("-");
  87. for (i = 1; i <= le2; i++)
  88. printf("%d", B[i]);
  89. printf("\n");
  90. }
  91. }
  92. else//A는 음수, B는 양수
  93. {
  94. len1 = le1 = strlen(A) - 1;
  95. len2 = le2 = strlen(B);
  96. for (i = 0; i < le1; i++)
  97. A[i + 1] -= 48;
  98. for (i = 0; i < le2; i++)
  99. B[i] -= 48;
  100. if (len1 > len2)//A의 절댓값이 B의 절댓값보다 큼을 자릿수로 알 수 있으면
  101. {
  102. for (i = 0; i < le2; i++)
  103. {
  104. A[le1 - i] = A[le1 - i] - B[le2 - i - 1];
  105. if (A[le1 - i] < 0)
  106. {
  107. A[le1 - i] += 10;
  108. A[le1 - i - 1] -= 1;
  109. }
  110. }
  111. printf("-");
  112. for (i = 0; i < le1; i++)
  113. {
  114. if (A[i + 1] == 0 && check == 0)
  115. continue;
  116. else
  117. {
  118. check = 1;
  119. printf("%d", A[i + 1]);
  120. }
  121. }
  122. printf("\n");
  123. }
  124. else if (len2 > len1)//B의 절댓값이 A의 절댓값보다 큼을 자릿수로 알 수 있다면
  125. {
  126. for (i = 0; i < le1; i++)
  127. {
  128. B[le2 - i - 1] = B[le2 - i - 1] - A[le1 - i];
  129. if (B[le2 - i - 1] < 0)
  130. {
  131. B[le2 - i - 1] += 10;
  132. B[le2 - i - 2] -= 1;
  133. }
  134. }
  135. for (i = 0; i < le2; i++)
  136. {
  137. if (B[i] == 0 && check == 0)
  138. continue;
  139. else
  140. {
  141. check = 1;
  142. printf("%d", B[i]);
  143. }
  144. }
  145. printf("\n");
  146. }
  147. else if (strcmp(A + 1, B) == 1) //A의 절댓값이 B의 절댓값보다 크다면
  148. {
  149. for (i = 0; i < le1; i++)
  150. {
  151. A[le1 - i] = A[le1 - i] - B[le2 - i - 1];
  152. if (A[le1 - i] < 0)
  153. {
  154. A[le1 - i] += 10;
  155. A[le1 - i - 1] -= 1;
  156. }
  157. }
  158. printf("-");
  159. for (i = 0; i < le1; i++)
  160. {
  161. if (A[i + 1] == 0 && check == 0)
  162. continue;
  163. else
  164. {
  165. check = 1;
  166. printf("%d", A[i + 1]);
  167. }
  168. }
  169. printf("\n");
  170. }
  171. else if (strcmp(A + 1, B) == -1) //A의 절댓값이 B의 절댓값보다 작다면
  172. {
  173. for (i = 0; i < le2; i++)
  174. {
  175. B[le2 - i - 1] = B[le2 - i - 1] - A[le1 - i];
  176. if (B[le2 - i - 1] < 0)
  177. {
  178. B[le2 - i - 1] += 10;
  179. B[le2 - i - 2] -= 1;
  180. }
  181. }
  182. for (i = 0; i < le2; i++)
  183. {
  184. if (B[i] == 0 && check == 0)
  185. continue;
  186. else
  187. {
  188. check = 1;
  189. printf("%d", B[i]);
  190. }
  191. }
  192. printf("\n");
  193. }
  194. else//두 수의 절댓값이 같다면
  195. printf("0\n");
  196. }
  197. }
  198. else
  199. {
  200. if (B[0] == '-')//A는 양수, B는 음수
  201. {
  202. len1 = le1 = strlen(A);
  203. len2 = le2 = strlen(B) - 1;
  204. for (i = 0; i < le1; i++)
  205. A[i] -= 48;
  206. for (i = 0; i < le2; i++)
  207. B[i + 1] -= 48;
  208. if (len1 > len2)//A의 절댓값이 B의 절댓값보다 큼을 자릿수로 알 수 있으면
  209. {
  210. for (i = 0; i < le2; i++)
  211. {
  212. A[le1 - i - 1] = A[le1 - i - 1] - B[le2 - i];
  213. if (A[le1 - i - 1] < 0)
  214. {
  215. A[le1 - i - 1] += 10;
  216. A[le1 - i - 2] -= 1;
  217. }
  218. }
  219. for (i = 0; i < le1; i++)
  220. {
  221. if (A[i] == 0 && check == 0)
  222. continue;
  223. else
  224. {
  225. check = 1;
  226. printf("%d", A[i]);
  227. }
  228. }
  229. printf("\n");
  230. }
  231. else if (len2 > len1)//B의 절댓값이 A의 절댓값보다 큼을 자릿수로 알 수 있다면
  232. {
  233. for (i = 0; i < le1; i++)
  234. {
  235. B[le2 - i] = B[le2 - i] - A[le1 - i - 1];
  236. if (B[le2 - i] < 0)
  237. {
  238. B[le2 - i] += 10;
  239. B[le2 - i - 1] -= 1;
  240. }
  241. }
  242. printf("-");
  243. for (i = 0; i < le2; i++)
  244. {
  245. if (B[i + 1] == 0 && check == 0)
  246. continue;
  247. else
  248. {
  249. check = 1;
  250. printf("%d", B[i + 1]);
  251. }
  252. }
  253. printf("\n");
  254. }
  255. else if (strcmp(A, B + 1) == 1) //A의 절댓값이 B의 절댓값보다 크다면
  256. {
  257. for (i = 0; i < le1; i++)
  258. {
  259. A[le1 - i - 1] = A[le1 - i - 1] - B[le2 - i];
  260. if (A[le1 - i - 1] < 0)
  261. {
  262. A[le1 - i - 1] += 10;
  263. A[le1 - i - 2] -= 1;
  264. }
  265. }
  266. for (i = 0; i < le1; i++)
  267. {
  268. if (A[i] == 0 && check == 0)
  269. continue;
  270. else
  271. {
  272. check = 1;
  273. printf("%d", A[i]);
  274. }
  275. }
  276. printf("\n");
  277. }
  278. else if (strcmp(A, B + 1) == -1) //A의 절댓값이 B의 절댓값보다 작다면
  279. {
  280. for (i = 0; i < le2; i++)
  281. {
  282. B[le2 - i] = B[le2 - i] - A[le1 - i - 1];
  283. if (B[le2 - i] < 0)
  284. {
  285. B[le2 - i] += 10;
  286. B[le2 - i - 1] -= 1;
  287. }
  288. }
  289. printf("-");
  290. for (i = 0; i < le2; i++)
  291. {
  292. if (B[i + 1] == 0 && check == 0)
  293. continue;
  294. else
  295. {
  296. check = 1;
  297. printf("%d", B[i + 1]);
  298. }
  299. }
  300. printf("\n");
  301. }
  302. else//두 수의 절댓값이 같다면
  303. printf("0\n");
  304. }
  305. else//A, B 모두 양수
  306. {
  307. len1 = le1 = strlen(A);
  308. len2 = le2 = strlen(B);
  309. for (i = 0; i < le1; i++)
  310. A[i] -= 48;
  311. for (i = 0; i < le2; i++)
  312. B[i] -= 48;
  313. if (len1 >= len2)
  314. {
  315. for (i = 0; i < len2; i++)
  316. {
  317. A[le1 - i - 1] = A[le1 - i - 1] + B[le2 - i - 1];
  318. if (A[le1 - i - 1] >= 10)
  319. {
  320. if (le1 - i - 1 == 0)
  321. continue;
  322. c = A[le1 - i - 1] / 10;
  323. A[le1 - i - 1] -= c * 10;
  324. A[le1 - i - 2] += c;
  325. }
  326. }
  327. for (; i < len1; i++)//음수에서와 같습니다.
  328. {
  329. if (A[le1 - i - 1] >= 10)
  330. {
  331. if (le1 - i - 1 == 0)
  332. continue;
  333. c = A[le1 - i - 1] / 10;
  334. A[le1 - i - 1] -= c * 10;
  335. A[le1 - i - 2] += c;
  336. }
  337. }
  338. for (i = 0; i < len1; i++)
  339. printf("%d", A[i]);
  340. }
  341. else
  342. {
  343. for (i = 0; i < len1; i++)
  344. {
  345. B[le2 - i - 1] = B[le2 - i - 1] + A[le1 - i - 1];
  346. if (B[le2 - i - 1] >= 10)
  347. {
  348. if (le2 - i - 1 == 0)
  349. continue;
  350. c = B[le2 - i - 1] / 10;
  351. B[le2 - i - 1] -= c * 10;
  352. B[le2 - i - 2] += c;
  353. }
  354. }
  355. for (; i < len2; i++)//음수에서와 같습니다.
  356. {
  357. if (B[le2 - i - 1] >= 10)
  358. {
  359. if (le2 - i - 1 == 0)
  360. continue;
  361. c = B[le2 - i - 1] / 10;
  362. B[le2 - i - 1] -= c * 10;
  363. B[le2 - i - 2] += c;
  364. }
  365. }
  366. for (i = 0; i < le2; i++)
  367. printf("%d", B[i]);
  368. }
  369. printf("\n");
  370. }
  371. }
  372. check = 0;
  373. return 0;
  374. }
Success #stdin #stdout 0s 9624KB
stdin
1234567890 -1234567899
stdout
0