프로그래밍 알고리즘
[정올 1374] 긴 자리 덧셈 뺄셈
꾸준한사람
2023. 1. 3. 08:00
반응형
http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&wr_id=649&sca=99&sfl=wr_hit&stx=1374
JUNGOL
www.jungol.co.kr
#include <stdio.h>
char A[205], B[205], add[205];
char* pB, * pS;
int alen, blen, biglen, smalllen, bgidx;
int strlen(const char* s, int len = 0) {
while (s[len]) len++;
return len;
}
int strcmp(const char* s, const char* t) {
while (*s && *s == *t) s++, t++;
return *s - *t;
}
void strcpy(char* dest, const char* src) {
while ((*dest++ = *src++));
}
int input() {
for (int i = 0; i < 205; i++) A[i] = B[i] = add[i] = 0;
scanf("%s", A);
scanf("%s", B);
alen = strlen(A);
blen = strlen(B);
if (alen == 1 && blen == 1 && A[0] == '0' && B[0] == '0') return 0;
else return 1;
}
void addf(int si, char val) {
int s = val - '0', b = (add[biglen + 1 - si]) ? (add[biglen + 1 - si] - '0') : (0);
if (s + b >= 10) {
add[biglen + 1 - si] = b + s - 10 + '0';
addf(si + 1, '1');
}
else add[biglen + 1 - si] = b + s + '0';
}
void subf(int si, char val) {
int s = val - '0', b = pB[biglen - si] - '0';
if (s > b) {
pB[biglen - si] += 10 - s;
subf(si + 1, '1');
}
else pB[biglen - si] -= s;
}
int main(void) {
while (input()) {
int result = strcmp(A, B), i;
if (alen > blen) { pB = A; pS = B; biglen = alen; smalllen = blen; }
else if (blen > alen) { pB = B; pS = A; biglen = blen; smalllen = alen; }
else if (result >= 0) { pB = A; pS = B; biglen = alen; smalllen = blen; }
else { pB = B; pS = A; biglen = blen; smalllen = alen; }
strcpy(&add[1], pB);
for (i = smalllen - 1; i >= 0; i--) {
addf(smalllen - i, pS[i]);
subf(smalllen - i, pS[i]);
}
for (i = 0; add[i] == 0 || add[i] == '0'; i++) {}
printf("%s\n", add + i);
if (result) {
for (i = 0; pB[i] == 0 || pB[i] == '0'; i++) {}
printf("%s\n", pB + i);
}
else printf("0\n");
}
return 0;
}
반응형