반응형

백준 22193번 Multiply 풀이 코드

C | C++ | Java | Python

영어(English)


문제 해설

주어진 수 두 개를 곱하는 코드를 만들면 됩니다. 문제는 길이가 길다는 거죠.

풀이

C로는 문제에서 주는 긴 수를 바로 곱하기 어렵습니다. 일단 큰 배열을 선언하여 숫자를 문자열로 받습니다. 그리고 수기로 곱셈을 하듯 뒷자리부터 하나씩 곱하여 result 배열의 뒤부터 채워줍니다. 이때, 개개 곱이 10(두 자리)을 넘을 수 있으므로, 결과 배열은 int 배열로 선언한 후 후처리 합니다.

수를 다 채운 후, 개별 곱이 두 자리를 넘을 경우를 위해 후처리를 진행합니다. 한 자리씩 10으로 나눈 후 그 값을 더 높은 자리에 더해주고 남은 값만 취합니다.

결과 배열을 앞부터 훑으며 처음 0이 아닌 숫자가 나올 때부터 답을 출력합니다. 만약 배열 끝까지 0밖에 없다면 '0'만 출력합니다.

C의 문제 풀이와 동일한 해답입니다. C++ 만의 특성을 활용할 수 있는 코드를 짜게 되면 업데이트할 예정입니다.

Java는 긴 수, BigInteger를 지원합니다. 이를 사용해 곱셈 코드로 풀 수 있습니다.

Python은 긴 수를 곱하는 데 별다른 처리가 필요 없습니다. 편하게 곱셈 코드로 풀 수 있습니다.

코드

#include <stdio.h>

int main() {
    int n, m;
    scanf("%d %d", &n, &m);
    char a[50000], b[50000];
    scanf("%s\n%s", a, b);

    int result[100000];

    for (int i = 0 ; i < m ; i++) {
        for (int j = 0 ; j < n ; j ++) {
            int temp = (a[n-1-j]-'0') * (b[m-1-i]-'0'); //문자에서 '0'을 빼면 숫자와 동일
            result[n+m-1-i-j] += temp;  
        }
    }

    for (int i = n+m-1 ; i > 0 ; i--) {
        result[i-1] += result[i] / 10;
        result[i] %= 10; 
    }

    int flag = 0;
    for (int i = 0 ; i < n+m ; i++) {
        if (flag == 0) {
            if (result[i] != 0)
                flag = 1;
            else if (i == n+m-1)
                printf("0");
        }
        if (flag != 0)
            printf("%d", result[i]);
    }
    return 0;
}
#include <iostream>
using namespace std;

int main() {
    int n, m;
    cin>>n>>m;
    char a[50000], b[50000];
    cin>>a>>b;

    int result[100000];

    for (int i = 0 ; i < m ; i++) {
        for (int j = 0 ; j < n ; j ++) {
            int temp = (a[n-1-j]-'0') * (b[m-1-i]-'0'); //문자에서 '0'을 빼면 숫자와 동일
            result[n+m-1-i-j] += temp;  
        }
    }

    for (int i = n+m-1 ; i > 0 ; i--) {
        result[i-1] += result[i] / 10;
        result[i] %= 10; 
    }

    bool flag = false;
    for (int i = 0 ; i < n+m ; i++) {
        if (!flag) {
            if (result[i] != 0)
                flag = true;
            else if (i == n+m-1)
                cout<<"0";
        }
        if (flag)
            cout<<result[i];
    }
    return 0;
}
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.math.BigInteger;

public class Main {
	public static void main(String[] args) throws IOException {
		BufferedReader bf = new BufferedReader(new InputStreamReader(System.in));
		String trash = bf.readLine();
		BigInteger a = new BigInteger(bf.readLine());
		BigInteger b = new BigInteger(bf.readLine());
		System.out.println(a.multiply(b));
	}
}
n,m = map(int,input().split())
a = int(input())
b = int(input())
print(a*b)

문제 출처

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

반응형

+ Recent posts