되 나눔수

문제 설명

임의의 정수 n이 있을때, n의 약수의 개수로 n을 나눌 수 있을 경우 이를 되 나눔수 라고 한다

예를 들어 1(1개), 12(6개), 9(3개)의 경우 되 나눔이 가능하지만 7(2개), 16(5개)의 경우 되 나눔이 되지 않는다

숫자 a, b (1≤a≤b≤1000000)(b-a≤1000)이 입력되었을 경우, a,b를 포함하여 a부터 b 사이에 있는 수 중 되 나눔 수의 개수를 구하는 프로그램을 작성하고자 한다

입력

첫째 줄에 검사하고자 하는 총 경우의 수 T (1≤T≤50)가 주어진다

이어지는 T 줄 각각엔 두 정수 a, b가 하나의 공백으로 구분되어 주어진다

출력

검사하는 각 경우에 대해 a부터 b 사이에 있는 수 중 되 나눔 수의 개수를 출력하라

실행 예시

입력

6
1 2
1 200
904 1217
31924 32430
67890 68888
891256 892256

출력

2
25
22
31
50
44

문제 풀이

#include<iostream>

using namespace std;

int cnt, first, second; // 테스트 케이스 개수, 첫 번째 입력값, 두 번째 입력값 설정
int check, divisior; // 약수의 개수, 되 나눔수 개수 설정

int main() {

	cin >> cnt;
	for (int k = 0; k < cnt; k++) {
		cin >> first >> second; // 입력
		divisior = 0; // 되 나눔수 개수 초기화
		for (int i = first; i <= second; i++) {
			check = 0; // 약수 개수 초기화
			for (int j = 1; j * j <= i; j++) { // j의 제곱 수 보다 작으면 반복문 중지
				if (i % j == 0) { // j가 i의 약수 일 때,
					if (j * j == i) check++; // i가 j의 제곱 수 이면 약수의 개수 1 증가
					if (j * j < i) check += 2; // i가 j의 제곱 수 보다 크면 약수의 개수 2개 증가 -> j와 짝을 이루는 다른 약수가 존재하므로 2개를 증가
				}
			} // 약수의 개수 확인
			if (i % check == 0) divisior++; // 약수의 개수로 i가 나누어지면 되 나눔수 개수 1 증가 
		} // a~b 까지의 되 나눔수 개수 체크
		cout << divisior << "\\n";
	} // 검사하고자 하는 테스트 케이스만큼 반복
	return 0;
}

'Problem Solving > C++' 카테고리의 다른 글

[프로그래머스] 점 찍기  (4) 2023.09.20
[프로그래머스] 약수의 합  (0) 2023.09.18
2178번 - 미로 탐색  (0) 2023.07.24
1389번 - 케빈 베이컨의 6단계 법칙  (0) 2023.07.23
21736번 - 헌내기는 친구가 필요해  (0) 2023.07.22