링크 :
문제 설명 :
더보기
상근이는 학생들에게 두 양의 정수 A와 B의 최대공약수를 계산하는 문제를 내주었다. 그런데, 상근이는 학생들을 골탕먹이기 위해 매우 큰 A와 B를 주었다.
상근이는 N개의 수와 M개의 수를 주었고, N개의 수를 모두 곱하면 A, M개의 수를 모두 곱하면 B가 된다.
이 수가 주어졌을 때, 최대공약수를 구하는 프로그램을 작성하시오.
입력 :
더보기
첫째 줄에 N(1 ≤ N ≤ 1000)이 주어진다. 둘째 줄에는 N개의 양의 정수가 공백으로 구분되어 주어진다. 이 수는 모두 1,000,000,000보다 작고, N개의 수를 곱하면 A가 된다.
셋째 줄에 M(1 ≤ M ≤ 1000)이 주어진다. 넷째 줄에는 M개의 양의 정수가 공백으로 구분되어 주어진다. 이 수는 모두 1,000,000,000보다 작고, M개의 수를 곱하면 B가 된다.
출력 :
더보기
두 수의 최대공약수를 출력한다. 만약, 9자리보다 길다면, 마지막 9자리만 출력한다. (최대 공약수가 1000012028인 경우에는 000012028을 출력해야 한다)
예제 입력 :
더보기
3
358572 83391967 82
3
50229961 1091444 8863
예제 출력 :
더보기
000012028
접근법 :
1) 어떻게 풀 것인가?
2) 시간복잡도
3) 공간복잡도
4) 풀면서 놓쳤던점
5) 이 문제를 통해 얻어갈 것
C++ 코드 :
// 최대공약수 2824
#if 1
#pragma warning(disable:4996)
#include <cstdio>
#define MAX (1000+3)
#define INF (1000000000)
using namespace std;
long long gcd(long long a, long long b) {
// a > b가 되도록 swap(a,b)
if (b > a) {
long long tmp = b;
b = a;
a = tmp;
}
// 유클리드 호제법
long long c;
while (b) {
c = a % b;
a = b;
b = c;
}
return a;
}
int N,M;
int A[MAX];
int B[MAX];
long long ans = 1;
bool isOver;
int main() {
// 1. 입력
//freopen("input.txt", "r", stdin);
scanf("%d", &N);
for (int i = 0; i < N; i++) {
scanf("%d", &A[i]);
}
scanf("%d", &M);
for (int i = 0; i < M; i++) {
scanf("%d", &B[i]);
}
// 2. 이중 for문
long long gc;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
gc = gcd(A[i], B[j]);
ans *= gc;
A[i] /= gc;
B[j] /= gc;
// 10자리 이상이면 마지막 9자리만 출력
if (ans >= INF) {
ans %= INF;
isOver = true;
}
}
}
// 3. 출력방식 조정
if (isOver) {
printf("%09lld", ans);
}
else {
printf("%lld", ans);
}
return 0;
}
#endif
반응형
'알고리즘 Algorithm > BOJ 백준 (초급~중급)' 카테고리의 다른 글
[BOJ 백준] 1(4375) C++ (0) | 2023.01.12 |
---|---|
[BOJ 백준] 보이는 점의 개수(2725) C++ (0) | 2023.01.12 |
[BOJ 백준] 암호제작(1837) C++ (0) | 2023.01.12 |
[BOJ 백준] 소인수분해(11653) C++ (0) | 2023.01.12 |
[BOJ 백준] 소수의 연속합(1644) Java, C++ (0) | 2023.01.12 |