본문 바로가기
AI HW study/Baekjoon

백준 9단계: 약수, 배수와 소수

by jyun13 2023. 7. 18.

<1> 5086번 배수와 약수

문제

4 × 3 = 12이다.

이 식을 통해 다음과 같은 사실을 알 수 있다.

3은 12의 약수이고, 12는 3의 배수이다.

4도 12의 약수이고, 12는 4의 배수이다.

두 수가 주어졌을 때, 다음 3가지 중 어떤 관계인지 구하는 프로그램을 작성하시오.

  1. 첫 번째 숫자가 두 번째 숫자의 약수이다.
  2. 첫 번째 숫자가 두 번째 숫자의 배수이다.
  3. 첫 번째 숫자가 두 번째 숫자의 약수와 배수 모두 아니다.

입력

입력은 여러 테스트 케이스로 이루어져 있다. 각 테스트 케이스는 10,000이 넘지않는 두 자연수로 이루어져 있다. 마지막 줄에는 0이 2개 주어진다. 두 수가 같은 경우는 없다.

출력

각 테스트 케이스마다 첫 번째 숫자가 두 번째 숫자의 약수라면 factor를, 배수라면 multiple을, 둘 다 아니라면 neither를 출력한다.

 

예제 입력 1 

8 16
32 4
17 5
0 0

예제 출력 1 

factor
multiple
neither

 

 

#define _CRT_SECUER_NO_WARNINGS
#include <stdio.h>

int main() {
int a, b;
while (1)
{
scanf("%d %d", &a, &b);
if ((a != 0) && (b != 0)) {
if (b % a == 0) {
printf("factor\n");
continue;
}
else if (a % b == 0) {
printf("multiple\n");
continue;
}
else {
printf("neither\n");
continue;
}
}
else if ((a == 0) && (b == 0)) break; }
return 0; }

 

<2> 2501번 약수 구하기

문제

어떤 자연수 p와 q가 있을 때, 만일 p를 q로 나누었을 때 나머지가 0이면 q는 p의 약수이다. 

6을 예로 들면

  • 6 ÷ 1 = 6 … 0
  • 6 ÷ 2 = 3 … 0
  • 6 ÷ 3 = 2 … 0
  • 6 ÷ 4 = 1 … 2
  • 6 ÷ 5 = 1 … 1
  • 6 ÷ 6 = 1 … 0

그래서 6의 약수는 1, 2, 3, 6, 총 네 개이다.

두 개의 자연수 N과 K가 주어졌을 때, N의 약수들 중 K번째로 작은 수를 출력하는 프로그램을 작성하시오.

입력

첫째 줄에 N과 K가 빈칸을 사이에 두고 주어진다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.

출력

첫째 줄에 N의 약수들 중 K번째로 작은 수를 출력한다. 만일 N의 약수의 개수가 K개보다 적어서 K번째 약수가 존재하지 않을 경우에는 0을 출력하시오.

예제 입력 1 

6 3

예제 출력 1 

3

 

#define _CRT_SECUER_NO_WARNINGS
#include <stdio.h>

int main() {
int n, k, i;
int count = 0;

scanf("%d %d", &n, &k);

//n의 약수 찾기
for (i = 1; i <= n+1; i++) { 
<< 이 문장이 오래걸림// 입력(25 3) 일때 출력이 안나왔는데 i의 범위를 n+1까지 했을 때 출력이 3으로 잘 나왔다. 


if (count == k) {
printf("%d\n", i-1);
break;
}     << 다음 if 문과 이 if 문의 순서도 헷갈림 count 하기 전에 count == k 일때 break를 먼저 하는게 맞음 !!

if (n % i == 0) {
count++; }
}
if (count < k) printf("0");
return 0;
}

 

<3> 9506번 약수들의 합 **

문제

어떤 숫자 n이 자신을 제외한 모든 약수들의 합과 같으면, 그 수를 완전수라고 한다.

예를 들어 6은 6 = 1 + 2 + 3 으로 완전수이다.

n이 완전수인지 아닌지 판단해주는 프로그램을 작성하라.

입력

입력은 테스트 케이스마다 한 줄 간격으로 n이 주어진다. (2 < n < 100,000)

입력의 마지막엔 -1이 주어진다.

출력

테스트케이스 마다 한줄에 하나씩 출력해야 한다.

n이 완전수라면, n을 n이 아닌 약수들의 합으로 나타내어 출력한다(예제 출력 참고).

이때, 약수들은 오름차순으로 나열해야 한다.

n이 완전수가 아니라면 n is NOT perfect. 를 출력한다.

예제 입력 1

6 = 1 + 2 + 3
12 is NOT perfect.
28 = 1 + 2 + 4 + 7 + 14

예제 출력 1

6 12 28 -1

 

#define _CRT_SECUER_NO_WARNINGS
#include <stdio.h>

int main() {
int n, i;
while (1)
{
scanf("%d", &n);
if (n != -1) {
int sum = 0;
for (i = 1; i < n; i++) {
if (n % i == 0) sum += i;
}
if (n == sum) {
printf("%d = 1", n);

for (i = 2; i < n; i++) {
if (n % i == 0) printf(" + %d", i);
}
printf("\n");
}
else if (n != sum) printf("%d is NOT perfect.\n", n);
}
else if (n == -1) break;
}
return 0;
}

 

<4> 1978번 소수 찾기

문제

주어진 수 N개 중에서 소수가 몇 개인지 찾아서 출력하는 프로그램을 작성하시오.

입력

첫 줄에 수의 개수 N이 주어진다. N은 100이하이다. 다음으로 N개의 수가 주어지는데 수는 1,000 이하의 자연수이다.

출력

주어진 수들 중 소수의 개수를 출력한다.

예제 입력 1 

4
1 3 5 7

예제 출력 1 

3

 

#define _CRT_SECUER_NO_WARNINGS
#include <stdio.h>

int main() {

int n, k, m;
scanf("%d", &n);
int count = 0;
for (int i = 0; i < n; i++) {
scanf("%d", &k);
int d = 0;
for (m = 1; m <= k; m++) {
if (k % m == 0) {
d++;
}
}
if (d == 2) count++;
}
printf("%d", count);
return 0;
}

 

<5> 2581번 소수

문제

자연수 M과 N이 주어질 때 M이상 N이하의 자연수 중 소수인 것을 모두 골라 이들 소수의 합과 최솟값을 찾는 프로그램을 작성하시오.

예를 들어 M=60, N=100인 경우 60이상 100이하의 자연수 중 소수는 61, 67, 71, 73, 79, 83, 89, 97 총 8개가 있으므로, 이들 소수의 합은 620이고, 최솟값은 61이 된다.

입력

입력의 첫째 줄에 M이, 둘째 줄에 N이 주어진다. M과 N은 10,000이하의 자연수이며, M은 N보다 작거나 같다.

출력

M이상 N이하의 자연수 중 소수인 것을 모두 찾아 첫째 줄에 그 합을, 둘째 줄에 그 중 최솟값을 출력한다. 

단, M이상 N이하의 자연수 중 소수가 없을 경우는 첫째 줄에 -1을 출력한다.

예제 입력 1 

60
100

예제 출력 1 

620
61

 

#define _CRT_SECUER_NO_WARNINGS
#include <stdio.h>

int main() {

int n, m;
int i, k;

scanf("%d", &m);
scanf("%d", &n);

int sum = 0; >> 위치 중요 (sum++이 되는 for문 바로 위에 sum=0을 해야함) 
for (i = m; i <= n; i++) {

int count = 0;
for (k = 1; k <= i; k++) {
if (i % k == 0) {
count++;
}
}

if (count == 2) {
sum += i;
}
}
if (sum == 0) printf("-1");
else printf("%d\n", sum);

for (i = m; i <= n; i++) {

int count = 0;
for (k = 1; k <= i; k++) {
if (i % k == 0) {
count++;
}
}

if (count == 2) {
printf("%d", i);
break;
}
}

return 0;
}

 

<6> 11653번 소인수분해

문제

정수 N이 주어졌을 때, 소인수분해하는 프로그램을 작성하시오.

입력

첫째 줄에 정수 N (1 ≤ N ≤ 10,000,000)이 주어진다.

출력

N의 소인수분해 결과를 한 줄에 하나씩 오름차순으로 출력한다. N이 1인 경우 아무것도 출력하지 않는다.

예제 입력 1 

72

예제 출력 1 

2
2
2
3
3

 

#define _CRT_SECUER_NO_WARNINGS
#include <stdio.h>

int main() {

long int n;
int i = 2;
scanf("%ld", &n);

while (1) {
if (n == 1) break;
else {
if (n % i == 0) {
n = (n / i);
printf("%d\n", i);
}
else i++;
}
}
return 0;
}

 

'AI HW study > Baekjoon' 카테고리의 다른 글

백준 8단계: 일반 수학 1  (0) 2023.07.20
백준 6단계 : 심화 1  (0) 2023.07.19
백준 5단계 문자열  (0) 2023.07.15
백준 5단계 문자열 개념 정리  (0) 2023.07.15
백준 4단계: 1차원 배열  (0) 2023.07.14