[실전 문제] 큰 자릿수 곱셈

2021. 2. 18. 12:10코딩 테스트/실전 문제

1. 문제

두 자연수가 주어질 때 그들의 곱셈을 계산하는 프로그램을 작성하시오. 각 수는 1 이상 10^100 미만의 범위를 가진다. 


입력

첫 번째 줄과 두 번째 줄에 각각 하나의 자연수가 주어진다. 

출력

첫 번째 줄에 곱셈의 결과를 출력한다. 

예제 입력

123112981293812938139
1298928491101221811

예제 출력

159914959026945386297336486942660549729

 

 

 

2. 풀이

이 문제는 작은 수를 예시로 가져와 풀어야 쉽게 이해가 된다. 예를 들어 주어진 입력이 14 x 14라면 다음과 같이 처리가 된다.

package org.example;

import java.io.*;

public class Main {

    private static final BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
    private static final BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(System.out));

    public static void main(String[] args) throws IOException {

        String[] s1 = br.readLine().split("");
        String[] s2 = br.readLine().split("");

        int[] n = new int[s1.length];
        int[] m = new int[s2.length];
        int[] result = new int[s1.length + s2.length];

        for(int i = s1.length - 1; i >= 0; i--) {
            n[s1.length-1-i] = Integer.parseInt(s1[i]);
        }

        for(int i = s2.length - 1; i >= 0; i--) {
            m[s2.length-1-i] = Integer.parseInt(s2[i]);
        }

        for(int i = 0; i < s1.length; i++) {
            for(int j = 0; j < s2.length; j++) {
                result[i+j] += n[i] * m[j];
            }
        }

        for(int i = 0; i < s1.length + s2.length; i++) {
            if(i < s1.length + s2.length - 1 && result[i] >= 10) {
                result[i+1] += result[i]/10;
                result[i] %= 10;
            }
        }

        int zero = s1.length + s2.length - 1; // 0 삭제를 위한 인덱스 
        while(result[zero] == 0) {
            zero--;
        }
        for(int i = zero; i >= 0; i--) {
            bw.write(result[i] + "");
        }

        br.close();
        bw.flush();
        bw.close();
    }

}
728x90