忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/11/22 21:31 |
PHP1-33:PHPでカプレカその1

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
<?php
    //カプレカ操作をしてみる
    
    //検証する数
    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


2008/10/14 16:55 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<PHP1-34:PHPでカプレカその2 | HOME | PHP1-32:PHPでカレンダー>>
忍者ブログ[PR]