프로그래밍 알고리즘

[정올 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;
}
반응형