Wikipediaでいうところの定義2のほうのカプレカ操作を行ってみる。
各桁の数値を大きい順に並べた数から、各桁の数値を小さい順に並べた数を引く、という操作を繰り返すと最後は6174のような決まった数、もしくはループになるというものだ。
というわけでとりあえずさくっと作ってみましょう。
kaprekar.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
//カプレカ操作をしてみる
//検証する数
if(isset($_REQUEST['k'])){
$seed=(int)$_REQUEST['k'];
}else{
$seed=12345679;
}
//準備
$i=0;
$result_array=array();
$result_array[0]=$seed;
while(1){
//カプレカ
$tmp=kaprekar($result_array[$i]);
//返り値が既に存在すれば終了
if($a=array_search($tmp,$result_array)){
$result_array[$i+1]=$tmp.'='.$a;
break;
}
$result_array[$i+1]=$tmp;
$i++;
}
print("<pre>");print_r($result_array);die();
//一回のカプレカを計算する関数
function kaprekar($int){
is_int($int) or die('Not integer');
//配列に入れる
$int_array=str_split($int);
//小さい順
sort($int_array);
$int_d=implode('',$int_array);
//大きい順
rsort($int_array);
$int_u=implode('',$int_array);
//差
return $int_u-$int_d;
}
|
引数にk=123というふうに適当な数値を与えると引数のカプレカを操作します。
引数は必ず文字列としてやってきますが、is_intはPHPの関数としては珍しく型を厳格に評価するので、(int)で整数型に変換する必要があります。
出力例
Array
(
[0] => 12345679
[1] => 85308642
[2] => 86308632
[3] => 86326632
[4] => 64326654
[5] => 43208766
[6] => 85317642
[7] => 75308643
[8] => 84308652
[9] => 86308632=2
)
まあなんの問題もなく作れてしまいました。
しかし$seedを大きくしてみると、ほんの10桁程度で計算不能になってしまいます。
これは各要素を数値として扱っているからです。
次回はもっと大きな数のカプレカ計算を行えるようにしてみます。
PR
トラックバック
トラックバックURL: