1

シーケンス番号のN番目の桁を返す関数を作成しました。例:

1234567891011121314151617

  • 5桁目は5です
  • 20桁目は1

私の機能はこんな感じです

 <?php
   function getLength($number) {
   $length = 0;
   if ($number == 0){
      $length = 1;
   } else {
      $length = (int) log10($number)+1;
   }
     return $length;
  }
 ?>

<?php
 function getDigitNumber($digit){
   $number = 10000000000;
   $data = array();
   for($i=1;$i<=$number;$i++){  
   if(getLength($i) > 1){
     $array = str_split($i,1);
    for($n=0;$n<=count($array)-1;$n++){
        array_push($data,$array[$n]);
    }   
}else{
    $data[$i] = $i;
}
  } 
return $data[$digit];
}
?>

実行すると、このエラーメッセージ「致命的なエラー:許可されたメモリサイズ134217728バイトが使い果たされました(36バイトを割り当てようとしました)」のような問題が発生しました。たぶん私はvarに大きな数を割り当てたからです$number

どうすればそれを修正できますか..またはこれらの多数を処理できる関数を作成するにはどうすればよいですか?

ありがとう..

4

2 に答える 2

10

シーケンス番号のN番目の桁を返す関数を作成しました。例:

1234567891011121314151617

The 5-th digit is 5
The 20-th digit is 1

なぜだめですか:

$number[5];
$number[20];

とにかく数字は文字列でなければならないので、配列構文で文字にアクセスするだけです。

于 2013-01-30T01:08:26.710 に答える
2

メモリの問題については、確かに数が多いことが原因です。

$number = 10000000000;
$data = array();
for($i=1;$i<=$number;$i++){  
    if(getLength($i) > 1){
        $array = str_split($i,1);
        for($n=0;$n<=count($array)-1;$n++){
            array_push($data,$array[$n]);
        }
    } else{
        $data[$i] = $i;
    }
} 

Basically, it allocates an array ($data) of ~500,000,000,000 items, which is quite big...

Manipulating your number as a string (or as a character array) as suggested in the other answers/comments will be: easier, more readable, faster, less memory-consuming, ...

于 2013-01-30T01:29:15.060 に答える