找到第一个有 1000 位数字的斐波那契数
Find a very first Fibonacci number which has 1000 digits
这是我为解决我的问题而编写的代码,它可以快速生成第 10 位数字,我已将 php.ini max-execution-time 更改为 10000 一小时内仍然没有得到答复。我如何 运行 此代码 quickly/sppedly .
function fabNumber($n){
if($n==1 || $n==2) {
return 1;
}
return fabNumber($n-2) + fabNumber($n-1);
}
function count_digit($number){
return strlen($number);
}
$i = 1;
$count = 1;
while( $count != 1000){
$fab_number = fabNumber($i);
$count = count_digit($fab_number);
//var_dump($fab_number ,$count)."<br>";
++$i;
echo $fab_number . " index of ". $i ."<br>" ;
}
我应该使用 GMP 库
Edit 1:
function fabNumber($n){
if($n==1 || $n==2) {
return 1;
}
return gmp_strval( fabNumber($n-2) )+ gmp_strval(fabNumber($n-1) );
}
function count_digit($number){
return strlen($number);
}
$i = 1;
$count = 1;
while( $count != 100){
$fab_number =gmp_strval( fabNumber($i));
$count = count_digit($fab_number);
//var_dump($fab_number ,$count)."<br>";
++$i;
echo gmp_strval($fab_number) . " index of ". $i ."<br>" ;
}
@同样缓慢的进展
类似于:
function getFibonacci() {
$i = '0';
$k = '1'; //first fibonacci value
yield $k;
while(true) {
$k = gmp_add($i, $k);
$i = gmp_sub($k, $i);
yield $k;
}
}
foreach(getFibonacci() as $value) {
if (strlen($value) == 1000) {
break;
}
}
echo $value, PHP_EOL;
(PHP >= 5.5.0)
您可以缓存数字以节省时间,因为在您的版本中,您会在每次迭代时重新计算所有数字
$GLOBALS["fabTab"] = array();
function fabNumber($n){
if($n==1 || $n==2) {
return "1";
}
if (!isset($GLOBALS["fabTab"][$n])) {
$GLOBALS["fabTab"][$n] = bcadd(fabNumber($n-2), fabNumber($n-1));
}
return $GLOBALS["fabTab"][$n];
}
function count_digit($number){
return strlen($number);
}
$start = time();
$i = 1;
$count = 1;
while( $count != 1000) {
$fab_number = fabNumber($i);
$count = count_digit($fab_number);
//var_dump($fab_number ,$count)."<br>";
++$i;
}
echo "$fab_number<br/>index of ". $i ."<br>" ;
echo $count . " digits<br>" ;
echo (time() - $start) . " seconds<br>" ;
这是我为解决我的问题而编写的代码,它可以快速生成第 10 位数字,我已将 php.ini max-execution-time 更改为 10000 一小时内仍然没有得到答复。我如何 运行 此代码 quickly/sppedly .
function fabNumber($n){
if($n==1 || $n==2) {
return 1;
}
return fabNumber($n-2) + fabNumber($n-1);
}
function count_digit($number){
return strlen($number);
}
$i = 1;
$count = 1;
while( $count != 1000){
$fab_number = fabNumber($i);
$count = count_digit($fab_number);
//var_dump($fab_number ,$count)."<br>";
++$i;
echo $fab_number . " index of ". $i ."<br>" ;
}
我应该使用 GMP 库
Edit 1:
function fabNumber($n){
if($n==1 || $n==2) {
return 1;
}
return gmp_strval( fabNumber($n-2) )+ gmp_strval(fabNumber($n-1) );
}
function count_digit($number){
return strlen($number);
}
$i = 1;
$count = 1;
while( $count != 100){
$fab_number =gmp_strval( fabNumber($i));
$count = count_digit($fab_number);
//var_dump($fab_number ,$count)."<br>";
++$i;
echo gmp_strval($fab_number) . " index of ". $i ."<br>" ;
}
@同样缓慢的进展
类似于:
function getFibonacci() {
$i = '0';
$k = '1'; //first fibonacci value
yield $k;
while(true) {
$k = gmp_add($i, $k);
$i = gmp_sub($k, $i);
yield $k;
}
}
foreach(getFibonacci() as $value) {
if (strlen($value) == 1000) {
break;
}
}
echo $value, PHP_EOL;
(PHP >= 5.5.0)
您可以缓存数字以节省时间,因为在您的版本中,您会在每次迭代时重新计算所有数字
$GLOBALS["fabTab"] = array();
function fabNumber($n){
if($n==1 || $n==2) {
return "1";
}
if (!isset($GLOBALS["fabTab"][$n])) {
$GLOBALS["fabTab"][$n] = bcadd(fabNumber($n-2), fabNumber($n-1));
}
return $GLOBALS["fabTab"][$n];
}
function count_digit($number){
return strlen($number);
}
$start = time();
$i = 1;
$count = 1;
while( $count != 1000) {
$fab_number = fabNumber($i);
$count = count_digit($fab_number);
//var_dump($fab_number ,$count)."<br>";
++$i;
}
echo "$fab_number<br/>index of ". $i ."<br>" ;
echo $count . " digits<br>" ;
echo (time() - $start) . " seconds<br>" ;