브론즈Ⅰ
https://www.acmicpc.net/problem/9506
풀이 방법
n을 입력받고 1부터 n-1까지(자기 자신을 제외한 모든 약수들을 구해야 하므로)의 수 중 n의 약수를 찾기위해 for문을 이용해 i에 1부터 n-1까지 대입한다.
만약 n%i(n을 i로 나눈 나머지)가 0일 경우(i가 n의 약수일 경우) 배열에 그 수를 저장하고 n의 약수의 개수를 셀 cnt를 1 증가시킨다. 또한, n이 완전수인지를 판단해야 되기 때문에 sum에 약수 i를 더해준다.
이후 n이 약수들의 합 sum과 같다면 그에 맞는 주어진 출력형식(n = 약수 + 약수 + ... + 약수)대로 출력하고, n이 약수들의 합 sum과 다르다면 그에 맞는 주어진 출력형식(n is NOT perfect)대로 출력한다.
내 코드
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
#pragma warning(disable:4996)
#include <stdio.h>
int main(void) {
int n, i, j, cnt, sum, arr[100000] = {0};
while (1) {
cnt = 0, sum = 0;
scanf("%d", &n);
if (n == -1)
return 0;
for (i = 1, j = 0; i < n; ++i) {
if (n % i == 0) { //i가 n의 약수라면
arr[j++] = i;
++cnt;
sum += i;
}
}
if (n == sum) {
printf("%d = %d", n, arr[0]);
for (i = 1; i < cnt; ++i) {
printf(" + %d", arr[i]);
}
printf("\n");
}
else
printf("%d is NOT perfect.\n", n);
}
return 0;
}
|
cs |
코드설명
1 | scanf 함수를 사용할 때 경고창을 띄우지 않도록 하는 전처리 지시문이다.
2 | scanf, printf 함수를 사용하기 위한 전처리 지시문이다.
6 | 각각의 변수를 다음의 용도로 정의하였다.
// i : for문에서 사용하기 위해
// j : j번째 배열에 약수 i를 넣기 위한 변수이다.
// cnt: 약수의 개수를 저장하기 위해(배열의 길이를 저장하기 위해)
// sum : 약수의 합을 저장하기 위해
// arr[] : 약수를 저장하기 위해
9 | 새로운 n을 입력받을때마다 약수의 개수와 약수의 합을 초기화하기 위해
22~28 | n이 완전수일때 주어진 형식대로 출력을 하는 코드이다.
29~32 | n이 완전수가 아닐 때 주어진 형식대로 출력을 하는 코드이다.
느낀점
- 배열의 크기를 100,000으로 지정했지만, 더 작게 지정해도 될 것 같다. 파이썬 같은 언어를 사용했다면 배열의 원소를 하나씩 추가하면 되기 때문에 더 쉽게 작은 크기의 배열로 문제를 풀었을 것이다.
- 배열을 이용하지 않고, 출력할 때 for문으로 다시 약수를 구하는 방법도 있다.
- 약수를 구할 줄 안다면 크게 어려운 점은 없는 것 같다.
'백준 알고리즘 단계별로 풀어보기 > 약수, 배수와 소수' 카테고리의 다른 글
백준 알고리즘 11653번 소인수분해 (C언어) (1) | 2023.03.10 |
---|---|
백준 알고리즘 2581번 소수 (C언어) (0) | 2023.03.08 |
백준 알고리즘 1978번 소수 찾기 (C언어) (1) | 2023.03.06 |
백준 알고리즘 2501번 약수 구하기 (C언어) (0) | 2023.03.03 |
백준 알고리즘 5086번 배수와 약수 (C언어) (0) | 2023.03.02 |