获取序列中的第1,000,000,000位数字" 12345678910111213 ..."

时间:2014-05-29 06:12:14

标签: php

我尝试从这样的连续数字中获取第1000000位:1234567891011121314151617......

等了一分钟后,我得到了3,这是第1,000,000位,但当我试图得到第1,000,000,000位时,我得到了这样的信息:

  

[致命错误:允许的内存大小为134217728字节耗尽(尝试过   在C:\ xampp \ htdocs \ get \ new.php中分配40009728个字节)   4391

这是我的代码:

<?php
$tot = 1000000000;
$i = 0;
$j = 1;
$a = array();
do{
    $length = strlen((string)$j);
    $str = str_split((string)$j);
    if($length == 1){
        if($i == $tot - 1){
        $a[$i] = $j;
        }
    $i++;
    $j++;
    }
    else{
        for($o = 1;$o<=$length;$o++){
            if($i==$tot){
                break;
            }
                if($i == $tot -1){
                $a[$i] = $str[$o - 1];
                }
            $i++;
        }
        $j++;
    }
}
while($i<$tot);

echo print_r($a);
?>

当php无法生成1,000,000,000个数字时,如何生成1,000,000,000个数字?

1 个答案:

答案 0 :(得分:1)

你必须优化算法才能找到123系列的第N位... 9101112 ..... 100101102 ......

  1. 不要将数字存储在数组中,这会产生内存限制问题。
  2. 有两种简单的方法可以解决这个问题:

    1 /运行一个循环,继续添加每个数字的数字,我们称之为总和,当你在循环中添加下一个数字的位数时,说 ndigits ,如果sum + ndigits大于N(所需数字),则停止,并检查当前数字中的(Nth-sum)数字。

    演示http://codepad.org/Dekq4bCW

    <?php
    function findDigit($n)
    { 
      $sum = $num =  0;
      do{
          $num += 1;
          $sum += strlen($num);
      }while($n > $sum);
    
      $numStr = (string)($num);
      $dig = $numStr[$n - ($sum-strlen($numStr)) - 1] ;
      echo "Digit at ".$n." is : ".$dig."\n";
    }
    
    for($i=9;$i<=15;$i++)
    {
       findDigit($i);
    }
    
    ?>
    

    2 /由于数字模式已经知道,即9个单位数字,然后是双位数字,然后是三位数字等。您可以找出一个通用公式,在一次通话中为您提供第N位数字。