이 문제에서는 두 개의 숫자 START와 END가 주어져 하나의 숫자 범위를 정의합니다. 목표는 [START, END] 범위 안에 있는 숫자 중, 자기 자신의 0이 아닌 모든 자릿수로 나누어 떨어지는 숫자의 개수를 구하는 것입니다.
해결 방법은 START부터 END까지 숫자를 하나씩 순회하면서, 각 숫자에 대해 while 반복문을 사용해 해당 숫자가 0이 아닌 모든 자릿수로 나누어 떨어지는지 검사하는 것입니다. 조건을 만족하면 카운트를 증가시킵니다.
예제로 이해하기
입력
START=10 END=20
출력
0이 아닌 모든 자릿수로 나누어 떨어지는 숫자의 개수: 14
설명
10, 11, 12, 15, 20은 자신의 0이 아닌 모든 자릿수로 나누어 떨어집니다.
입력
START=100 END=200
출력
0이 아닌 모든 자릿수로 나누어 떨어지는 숫자의 개수: 25
설명
조건을 만족하는 숫자 목록: 100 101 102 104 105 110 111 112 115 120 122 124 126 128 132 135 140 144 150 155 162 168 175 184 200
프로그램에 적용한 접근 방식
범위를 나타내는 정수 변수 START와 END를 입력받습니다.
함수 divisiblebyDigits(int start, int end)는 범위 변수를 받아, 0이 아닌 모든 자릿수로 나누어 떨어지는 숫자의 개수를 반환합니다.
조건을 만족하는 숫자를 세기 위해 초기 count 변수를 0으로 설정합니다.
플래그 역할을 할 flag 변수를 0으로 초기화합니다.
for 반복문으로 i=start부터 i=end까지 범위의 숫자를 순회합니다.
각 숫자 num=i에 대해 while 반복문으로 num이 0보다 큰 동안 검사를 진행합니다.
digit = num % 10으로 마지막 자릿수를 추출합니다. digit이 0보다 크고 i % digit == 0이면 flag=1로 설정하고, 그렇지 않으면 flag=0으로 만들고 반복문을 종료(break)합니다. 이후 num = num / 10으로 다음 자릿수를 검사합니다.
i의 모든 0이 아닌 자릿수가 i를 완전히 나누어 떨어지게 하면 flag는 1이 되고, count를 증가시킵니다.
모든 반복문이 끝나면 count에는 조건을 만족하는 숫자의 총 개수가 저장됩니다.
count를 결과값으로 반환합니다.
예제 코드
#include <bits/stdc++.h>
using namespace std;
int divisiblebyDigits(int start, int end){
int count = 0;
int flag=0;
for (int i = start; i <= end; i++){
int num=i;
while(num>0){
int digit=num%10;
if(digit>0){
if(i%digit==0)
{ flag=1; } // 플래그 설정
else{
flag=0; // 플래그 해제
break;
}
}
num=num/10;
}
if(flag==1){ // 0이 아닌 모든 자릿수로 나누어 떨어지는 경우
count++;
//cout<<i<<" ";
}
}
return count;
}
int main(){
int START = 10, END = 50;
cout <<"0이 아닌 모든 자릿수로 나누어 떨어지는 숫자의 개수: "<< divisiblebyDigits(START,END);
return 0;
}출력 결과
위 코드를 실행하면 다음과 같은 출력이 생성됩니다.
0이 아닌 모든 자릿수로 나누어 떨어지는 숫자의 개수: 14