반응형
백준 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)
문제 출처
반응형
'Coding > BAEKJOON' 카테고리의 다른 글
[백준] 7287번 등록 풀이 코드 (C/C++/Java 자바/Python 파이썬) (0) | 2021.09.27 |
---|---|
[백준] 2475번 검증수 풀이 코드 (C/C++/Java 자바/Python 파이썬) (0) | 2021.09.26 |
[백준] 13236번 Collatz Conjecture 풀이 코드 (C/C++/Java 자바/Python 파이썬) (0) | 2021.08.27 |
[백준] 8760번 Schronisko 풀이 코드 (C/C++/Java 자바/Python 파이썬) (0) | 2021.08.11 |
[백준] 2742번 기찍 N 풀이 코드 (C/C++/Java 자바/Python 파이썬) (0) | 2021.08.01 |