https://www.acmicpc.net/problem/2609
2609번: 최대공약수와 최소공배수
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
www.acmicpc.net
문제
두 개의 자연수를 입력받아 최대 공약수와 최소 공배수를 출력하는 프로그램을 작성하시오.
입력
첫째 줄에는 두 개의 자연수가 주어진다. 이 둘은 10,000이하의 자연수이며 사이에 한 칸의 공백이 주어진다.
출력
첫째 줄에는 입력으로 주어진 두 수의 최대공약수를, 둘째 줄에는 입력으로 주어진 두 수의 최소 공배수를 출력한다.
#include<iostream>
using namespace std;
int main()
{
long long A, B; //입력받을 두 수
cin >> A >> B;
int arr_a[10000] = {0,};
int arr_b[10000] = {0,};
long long min_answer =1; //최소공배수 선언
long long max_answer =1; //최대공약수 선언
for (int i = 2; i < 10000; i++)
{
if ((A % i) == 0) //2로 나뉘어진다면
{
while (A % i == 0)//2로 그만나누어질때까지 나누고
{
A = A / i;
arr_a[i]++;// arr_a[2] == 2의 개수 증가시킴
}
}
if ((B % i) == 0) //B도 똑같이
{
while (B % i == 0)
{
B = B / i;
arr_b[i]++;
}
}
}
for (int i = 0; i < 10000; i++)
{
int min_count;
if (arr_a[i] <= arr_b[i])
min_count = arr_a[i];
if(arr_a[i] > arr_b[i])
min_count = arr_b[i];
if ((arr_a[i]) > 0 && (arr_b[i] > 0)) // 만약 arr_a[2]가 3 이라는건 2로 3번 나뉘어진다는거
{
while (min_count--)
{
min_answer *= i; //최소공배수에 i를 곱한다
}
}
else
continue;
}
for (int i = 0; i < 10000; i++)
{
int x = 1;
if ((arr_a[i]) > 0 || (arr_b[i] > 0))
{
int big; // 많은거 개수
if (arr_a[i] >= arr_b[i])
{
big = arr_a[i];
}
else
{
big = arr_b[i];
}
while(big--)
{
x *= i;
}
max_answer *= x;
}
}
cout << min_answer << endl;
cout << max_answer << endl;
}
'백준 c++ > (1-1)백준 c++ 알고리즘 기초' 카테고리의 다른 글
백준 1934 c++ 최소공배수 (0) | 2022.08.19 |
---|---|
백준 1929 c++ 소수 구하기 (0) | 2022.08.17 |
백준 1935 c++ 후위 표기식 2 (0) | 2022.08.15 |
백준 11656 c++ 접미사 배열 (0) | 2022.08.14 |
백준 10430 c++ 나머지 (0) | 2022.08.13 |