프로그래밍 알고리즘

[정올 1262] 긴 자리 곱셈

꾸준한사람 2023. 1. 3. 00:38
반응형

http://www.jungol.co.kr/bbs/board.php?bo_table=pbank&code=1262&sca=99 

 

JUNGOL

 

www.jungol.co.kr

#include <stdio.h>

char A[105], B[105], ans[205];

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 < 105; i++)   A[i] = B[i] = 0;
	for (int i = 0; i < 205; i++)   ans[i] = 0;

	scanf("%s", A);
	if (A[0] == '0' && strlen(A) == 1) return 0;
	scanf("%s", B);
	return 1;
}

void add(int val, int idx) {
	if (ans[idx] == 0)    ans[idx] = '0' + val;
	else {
		if (ans[idx] + val > '9') {
			ans[idx] += val - 10;
			add(1, idx - 1);
		}
		else    ans[idx] += val;
	}
}

int main() {
	int alen, blen, bgidx;
	while (input()) {
		alen = strlen(A);
		blen = strlen(B);

		if (blen == 1 && B[0] == '0') { printf("0\n"); continue; }

		for (int i = alen - 1; i >= 0; i--) //alen 10이면 9부터 시작, alen - i = 1~
		{
			if (A[i] == '-') continue;
			int a, b, dg10, dg1;
			a = A[i] - '0';
			for (int j = blen - 1; j >= 0; j--) //blen 7이면 6부터 시작, blen - j = 1~
			{
				if (B[j] == '-') continue;
				b = B[j] - '0';
				dg1 = a * b;
				dg10 = dg1 / 10;
				dg1 = dg1 % 10;
				add(dg1, 205 - (alen - i) - (blen - j));
				add(dg10, 205 - (alen - i) - (blen - j) - 1);
			}
		}
		for (bgidx = 1; ans[bgidx] == 0 || ans[bgidx] == '0'; bgidx++) {}
		if ((A[0] == '-' || B[0] == '-') && (A[0] != '-' || B[0] != '-'))
			ans[--bgidx] = '-';
		printf("%s\n", ans + bgidx);
	}

	return 0;
}
반응형