PHPで数値のすべての桁がその数値を割り切れるかチェックする方法
PHPでは、ある数値のすべての桁がその数値自身を割り切るかどうかを、剰余演算子(%)を使ったシンプルな関数で判定できます。この記事では、実際に動作するサンプルコードと、その仕組みをわかりやすく解説します。
サンプルコード
<?php
function divisibility_check($val, $digit)
{
// 桁が0ではなく、かつその桁で割り切れるかを判定する
return ($digit != 0 && $val % $digit == 0);
}
function divide_digits($n)
{
$temp = $n;
while ($temp > 0)
{
$digit = $temp % 10; // 一番下の桁を取り出す
if (!(divisibility_check($n, $digit)))
return false; // 1桁でも割り切れなければfalseを返す
$temp = intdiv($temp, 10); // 桁を1つずらす
}
return true; // すべての桁で割り切れた場合
}
$val = 128;
if (divide_digits($val))
echo "すべての桁が数値を割り切ります";
else
echo "すべての桁が数値を割り切るわけではありません";
?>出力結果
すべての桁が数値を割り切ります
コードの解説
divisibility_check 関数
この関数は、指定された1桁($digit)が数値($val)を余りなしで割り切れるかどうかを判定して返します。$digit が 0 の場合は除算が定義できないため、条件式の前半で除外しており、これによりゼロ除算エラーを確実に防いでいます。
divide_digits 関数
こちらの関数は、数値を構成するすべての桁を順番に検証します。ループ内では $temp % 10 によって最下位の桁を1つずつ取り出し、intdiv による整数除算で桁を右へずらしていきます。途中で1桁でも割り切れないものが見つかった時点で即座に false を返すため、無駄な計算が発生しません。なお、単純に $temp /= 10 と記述すると結果が浮動小数点数になってしまうため、intdiv を使うのが安全です。
メイン処理
判定対象の数値(ここでは 128)を定義し、divide_digits 関数に引数として渡します。128 の各桁は 1・2・8 であり、128 ÷ 1 = 128、128 ÷ 2 = 64、128 ÷ 8 = 16 といずれも割り切れるため、「すべての桁が数値を割り切ります」というメッセージが出力されます。もし1桁でも割り切れない場合は、else 側のメッセージが表示されます。
まとめ
桁ごとの判定では「% 10 で桁を取り出す」「intdiv(..., 10) で桁をずらす」という組み合わせが定石です。計算量は桁数に比例する O(d) で済み、大きな数値でも高速に動作します。あわせて、桁に 0 が含まれる場合のゼロ除算対策も忘れずに行いましょう。
-
Pythonで数値のすべての桁がその数を割り切れるかどうかを判定する方法
ある数値 n が与えられたとき、その数を構成するすべての桁が n を割り切れるかどうかを判定する問題を考えてみましょう。例えば、入力が n = 135 の場合、出力は True になります。これは以下のように、すべての桁で割り切れるためです。135 ÷ 1 = 135135 ÷ 3 = 45135 ÷ 5 = 27解決のためのアプローチこの問題は、次の手順で解くことができます。変数 val に n の値を代入します。val が 0 より大きい間、以下を繰り返します。d に val を 10 で割った余り(つまり一番下の桁)を代入します。n が d で割り切れない場合は False を返します。
-
Pythonで数値のすべての桁がその数自身を割り切るかどうかを判定する方法
はじめにこの記事では、与えられた問題に対する解法とアプローチについて学びます。具体的には、「ある整数のすべての桁が、その整数自身を割り切るかどうか」をPythonで判定する方法を解説します。問題文問題: 数値 n が与えられたとき、n のすべての桁が n を割り切るかどうかを判定してください。考慮すべきポイントまず、入力された数値に 0 が含まれていないかを確認する必要があります。0 で割ろうとするとゼロ除算例外(ZeroDivisionError)が発生するため、0 が含まれる場合は答えとして「No」を返さなければなりません。それ以外の場合は、一時変数 flag を用いて判定条件を宣言し、す