我尝试从这样的连续数字中获取第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个数字?
答案 0 :(得分:1)
你必须优化算法才能找到123系列的第N位... 9101112 ..... 100101102 ......
有两种简单的方法可以解决这个问题:
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位数字。