Computer >> 컴퓨터 >  >> 프로그래밍 >> PHP

PHP로 숫자의 모든 자릿수가 나누어떨어지는지 확인하는 방법

숫자의 모든 자릿수가 그 숫자 자신을 나누어떨어뜨릴 수 있는지 확인하는 문제는 코딩 테스트에서 자주 등장하는 유형입니다. 예를 들어 128의 자릿수는 1, 2, 8이며, 128은 세 숫자 모두로 나누어떨어지므로 참(true)입니다. 반면 255는 자릿수 2로 나누어떨어지지 않기 때문에 거짓(false)입니다.

이 글에서는 PHP로 이 문제를 해결하는 방법을 예제 코드와 함께 단계별로 살펴보겠습니다.

PHP 코드 예제

<?php
function divisibility_check($num, $digit)
{
    // 자릿수가 0이 아니고, 그 자릿수로 숫자가 나누어떨어지는지 검사
    return ($digit != 0 && $num % $digit == 0);
}
function divide_digits($n)
{
    $temp = $n;
    while ($temp > 0)
    {
        $digit = $temp % 10;          // 가장 오른쪽 자릿수 추출
        if (!divisibility_check($n, $digit))
            return false;             // 하나라도 실패하면 즉시 종료
        $temp = intdiv($temp, 10);    // 검사한 자릿수 제거
    }
    return true;
}
$val = 128;
if (divide_digits($val))
    echo "모든 자릿수로 나누어떨어집니다";
else
    echo "모든 자릿수로 나누어떨어지지 않습니다";
?>

실행 결과

모든 자릿수로 나누어떨어집니다

코드 동작 원리

1. divisibility_check() – 자릿수 하나 검사

이 함수는 원래 숫자와 검사할 자릿수, 두 개의 값을 받아 두 가지 조건을 확인합니다. 첫째, 자릿수가 0이 아닌지 살핍니다. 어떤 수도 0으로 나눌 수 없기 때문에 이 검사는 필수적입니다. 둘째, 나머지 연산자(%)를 사용해 원래 숫자가 해당 자릿수로 나누어떨어지는지 확인합니다. 두 조건을 모두 통과하면 true를 반환합니다.

2. divide_digits() – 모든 자릿수 순회

임시 변수 $temp에 원래 숫자를 복사한 뒤 while 루프를 돌며 매 반복마다 마지막 자릿수($temp % 10)를 추출해 divisibility_check()로 넘깁니다. 하나라도 나누어떨어지지 않으면 즉시 false를 반환하고, 모든 자릿수를 통과하면 true를 반환합니다.

여기서 한 가지 주의할 점이 있습니다. 자릿수를 제거할 때는 일반 나눗셈 연산자(/) 대신 intdiv()를 사용해야 합니다. PHP의 / 연산자는 실수 나눗셈을 수행하므로 25.5처럼 소수점 아래 값이 남게 되고, 루프가 의도한 대로 종료되지 않을 수 있습니다.

3. 메인 실행 부분

검사할 숫자를 변수에 담아 divide_digits()에 인수로 전달하고, 반환값에 따라 적절한 결과 메시지를 출력합니다.

다양한 입력값으로 확인하기

같은 로직으로 다른 숫자를 검사하면 다음과 같은 결과를 얻을 수 있습니다.

  • 128 → 자릿수 1, 2, 8 모두로 나누어떨어짐 → true
  • 255 → 자릿수 2로 나누어떨어지지 않음 → false
  • 105 → 자릿수에 0이 포함되어 0으로 나눌 수 없음 → false

마무리

이 알고리즘은 숫자의 자릿수만큼만 반복하므로 시간 복잡도가 O(d)(d는 자릿수의 개수)로 매우 효율적입니다. 자릿수 추출, 나머지 연산, 0 처리라는 세 가지 핵심 요소만 기억하면 비슷한 유형의 문제도 손쉽게 해결할 수 있습니다.