브론즈 III
https://www.acmicpc.net/problem/2501
2501호: 요인 찾기
첫 번째 줄에서 N과 K 사이에 공백을 두고 지정합니다. N은 1 이상 10,000 이하이다. K는 1 이상 N 이하이다.
www.acmicpc.net

해결 방법
약수는 자연수를 나누는 수입니다. 즉, 12의 약수는 1, 2, 3, 4, 6, 12입니다.
이것은 N의 약수 중에서 k번째로 작은 수를 출력하는 문제이므로 나머지를 확인한 후 N을 1~2, 3, 4, … N으로 for 문 cnt로 나누면 항상 나머지가 나올 때 생성된다. 나눗셈은 0입니다. 1씩 증가하여 k-가장 작은 숫자를 찾습니다.
내 코드
|
하나
2
삼
4
5
6
7
8일
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
#프라그마 경고(비활성화:4996)
#포함하다 <stdio.h>
내부 주로(비어 있는) {
내부 n, k, i, betw = 0깃발 = 0결과;
스캔프(“%d %d”, &N, &케이);
~을 위한 (나 = 하나; 나 <= N; ++나) {
만약에 (n% 나는 == 0)
++cnt;
만약에 (현재 == 나) {
깃발 = 하나;
부서지다;
}
}
만약에 (깃발 == 하나)
결과 = 나;
다른
결과 = 0;
압력(“%d\n”결과);
돌려 주다 0;
}
|
CS |
코드 설명
1 | scanf 함수를 사용할 때 경고창이 뜨지 않도록 하는 전처리 지시어입니다.
2 | 이것은 scanf 및 printf 함수를 사용하기 위한 전처리 명령문입니다.
6 | 각 변수는 다음과 같은 목적으로 정의되었습니다.
// cnt: N의 제수를 찾을 때마다 1씩 증가시켜 K번째로 작은 수를 찾습니다.
// Flag: K번째 분할자가 존재하는지 확인
// 결과: K번째 제수 또는 0 출력
10 | for문에서 i로 단순한 횟수를 반복하는 대신에 N을 i로 나누고 나누어지는지 확인하는 숫자 역할을 하므로 i가 1에서 N으로 회전합니다.
11~12 | 이 코드는 i가 N을 나누면 cnt를 1씩 증가시킵니다.
13~16 | cnt가 k와 같을 때(i가 k번째로 작은 인수일 때) 이 코드는 플래그 1을 할당하여 k번째 약수가 존재함을 나타내고 for 문을 마스킹합니다.
18~19 | 플래그가 1일 때(k번째 제수가 존재하는 경우) 결과에 k번째 제수인 i를 대입하는 코드입니다.
20~21 | 이 코드는 플래그가 0인 경우(k번째 약수가 존재하지 않는 경우) 결과를 0으로 바꿉니다.
나는 그것을 느꼈다
– 나눗셈의 개념과 산술 연산자 ‘%’를 알고 for 문을 잘 활용하면 쉽게 풀 수 있는 문제인 것 같습니다.