[C] 22193번: Multiply

[C] 22193번: Multiply
2026-03-10

문제#

https://www.acmicpc.net/problem/22193

음이 아닌 두 정수 A와 B의 곱을 계산하는 프로그램을 작성하시오. 두 정수는 10진수로 표기되며, 각각 N자리와 M자리 수입니다.

입력#

첫째 줄에 두 수의 길이 N과 M이 공백으로 구분되어 주어집니다. 둘째 줄에는 A가, 셋째 줄에는 B가 주어집니다. 주어지는 수는 0으로 시작하지 않습니다 (불필요한 0이 앞에 오지 않음).

출력#

A와 B의 곱을 0으로 시작하지 않게 출력하시오.

제한#

  • 1 ≤ N, M ≤ 50 000

서브태스크#

번호배점제한
120N, M ≤ 4
220N, M ≤ 9
330N, M ≤ 5 000
430추가 제약조건 없음

풀이#

큰 정수를 문자열로 받아, 사람이 계산하듯 각 자리수를 곱해 누적한 뒤 자리올림을 처리하는 방식입니다.

구체적으로는

  • A의 각 자리와 B의 각 자리를 곱해 res[i + j + 1]에 누적
  • 곱셈이 끝난 뒤 뒤에서부터 자리올림 처리
  • 앞쪽의 불필요한 0을 건너뛰고 출력

하는 방식으로 구현할 수 있습니다.

코드#

#include <stdio.h>
#define MAX 50001
#define MAX_RES 100001
char a[MAX], b[MAX];
int res[MAX_RES];
int main() {
int n, m;
scanf("%d %d", &n, &m);
scanf("%s", a);
scanf("%s", b);
for (int i = n - 1; i >= 0; i--) {
int da = a[i] - '0';
for (int j = m - 1; j >= 0; j--) {
res[i + j + 1] += da * (b[j] - '0');
}
}
for (int i = n + m - 1; i > 0; i--) {
res[i - 1] += res[i] / 10;
res[i] %= 10;
}
int start = 0;
while (start < n + m - 1 && res[start] == 0) {
start++;
}
for (int i = start; i < n + m; i++) {
printf("%d", res[i]);
}
printf("\n");
return 0;
}