개요
주어진 숫자 n의 모든 자릿수가 그 숫자 자체를 나눌 수 있는지 확인하는 프로그램을 작성해 보겠습니다. 예를 들어 숫자가 'xy' 형태라면, x와 y 두 자릿수 모두 이 숫자를 나누어야 한다는 의미입니다.
예시
입력 – 24
출력 – Yes
설명 – 24 % 2 == 0, 24 % 4 == 0 이므로 자릿수 2와 4 모두 24를 나눌 수 있습니다.
접근 방법
조건문을 활용하여 각 자릿수가 0이 아니면서 동시에 해당 숫자를 나눌 수 있는지 검사합니다. 구체적인 절차는 다음과 같습니다.
- 숫자의 각 자릿수를 하나씩 추출하며 반복(iteration)합니다.
- 각 자릿수가 0인지 먼저 확인합니다. 0으로 나누는 연산은 정의되지 않으므로 반드시 제외해야 합니다.
- 자릿수가 원래 숫자를 나누는지, 즉 나머지가 0인지 검사합니다.
- 모든 자릿수가 조건을 만족하면 "Yes", 하나라도 만족하지 않으면 "No"로 판정합니다.
C 언어 구현 예제
#include <stdio.h>
int main() {
int n = 24;
int temp = n;
int flag = 1;
while (temp > 0) {
int r = temp % 10; // 마지막 자릿수 추출
if (!(r != 0 && n % r == 0)) {
flag = 0; // 조건 불만족 시 플래그 해제
}
temp /= 10; // 처리한 자릿수 제거
}
if (flag == 1)
printf("The number is divisible by its digits");
else
printf("The number is not divisible by its digits");
return 0;
}
실행 결과
The number is divisible by its digits
코드 설명
- temp 변수 : 원본 숫자 n을 그대로 복사하여 사용합니다. 반복 과정에서 값이 계속 줄어들기 때문에 원본은 보존해야 합니다.
- r = temp % 10 : 현재 가장 오른쪽에 있는 자릿수를 추출합니다. 반복마다 temp를 10으로 나누어 다음 자릿수로 이동합니다.
- 0 처리 : 어떤 수도 0으로 나눌 수 없으므로, 숫자에 0이 포함되어 있으면 자동으로 "not divisible"로 판정됩니다.
- flag 변수 : 모든 자릿수가 조건을 통과하면 1로 유지되고, 하나라도 실패하면 0으로 설정됩니다.
이 알고리즘의 시간 복잡도는 O(d)이며, 여기서 d는 숫자의 자릿수 개수입니다. 따라서 매우 효율적으로 동작합니다.