如何从大数字中查找特定数字并计算?

时间:2017-04-26 15:25:57

标签: php substr execution-time strlen largenumber

在这里,我试图找出所有2并从给定数字计算它们。 我已经做到了。 但我的代码适用于少数类似的 $ number = 25,但是如果$ number = 10000000000;那么无法回显$ n,我认为是因为执行时间。任何更好的方法大量?

<?php
$n =0 ;
$number =25;
for($j = 1; $j<=$number ; $j++)
{
$l = strlen($j);
for($i =0;$i<$l;$i++)
{
$d = substr($j,$i,1);

    if($d ==2)
    {
        $n++;
    }

  }
 }
 echo $n;
 // answer is 9

?>

3 个答案:

答案 0 :(得分:0)

  

在这里,我试图找出所有2个并从给定数字中计算它们。我已经做到了。但是我的代码适用于$ number = 25这样的小数字,但如果$ number = 10000000000;那么无法回显$ n,我认为是因为执行时间。任何更好的方法大数?

你所描述的应该更像是

<?php

// clunky version with a loop
function countInStr($str, $chr) {
    $n = 0;
    $l = strlen( $str );
    for( $i =0; $i < $l; $i++ ) { 

        if( $chr == substr($str, $i, 1) ) {
            $n++;
        }

    }
    return $n;
}

$number = 25;
$sum=0;
for ( $i=0; $i <= $number ; $i++ ) {
    //echo $i." ";
    $sum += countInStr( $i, '2' );
}
echo $sum." ?= 9";

// x        counted in 1*10^x
/*
$known[6] = 600000; //1000000
$known[5] = 50000;  //100000
$known[4] = 4000;   //10000
$known[3] = 300;    //1000
$known[2] = 20;     //100
$known[1] = 1;      //10
*/

?>
  • 数字类型仅针对特定范围定义,因此会限制长度
  • 改为使用数组(列表)或字符串,然后你就不那么受限了
  • 不知道这两个循环是什么,但是按照你的描述你只想做一个计数循环;数组答案也适合这个问题,不知道为什么人们会投票给别人试图帮助
  • 为示例
  • 添加的范围(0,max)内的计数位数之和
  • 正如您在列表$known中所看到的那样(对于所有数字都是如此,不仅仅是2),您可以通过一种算法更加智能化,该算法可以分辨出更多的数字并替换&#34;笨&#34;数数。查看该算术的log()pow()等函数;提示:这有点像将数字从一个数字系统转换为另一个数字系统

答案 1 :(得分:0)

也许这就是你要找的东西

function count_char_in_string($str,$char){  // This one counts the $char in a single string
    $str="".$str;   // Convert to a string actually
    $total=0;
    for ($ix=0;$ix<strlen($str);$ix++){
        if (substr($str,$ix,1)==$char) {
            $total++;
        }
    }
    return $total;
}

$n=25000;
$total=0;
for ($ix=0;$ix<=$n;$ix++){
     $total+=count_char_in_string($ix,"2");
}
echo $total;

答案 2 :(得分:0)

我认为你可以使用modulo来避免字符串转换。

<强> PHP

<?php

$count = 0;
$n = (int) $argv[1];

for ($i = 0; $i <= $n; $i++) {
    $ii = $i;
    while ($ii > 1) {
        if ($ii % 10 == 2) {
            $count++;
        }
        $ii /= 10;
    }
}

echo $count;

如果我运行php run.php 1e8,我会得到:

User time (seconds): 117.98
System time (seconds): 1.17
Percent of CPU this job got: 95%
Elapsed (wall clock) time (h:mm:ss or m:ss): 2:05.00

<强> C

为了比较,我使用C:

编写了相同的脚本
#include <stdio.h>

int main(int argc, char *argv[]) {
    double n;
    sscanf(argv[1], "%lf", &n);
    int count = 0;

    for (int i = 0; i <= n; ++i)
    {
        int ii = i;
        while (ii > 1) {
            if (ii % 10 == 2) {
                count++;
            }
            ii /= 10;
        }
    }

    printf("%d\n", count);

    return 0;
}

使用相同的号码./count 1e8我得到了这个:

User time (seconds): 1.21
System time (seconds): 0.00
Percent of CPU this job got: 98%
Elapsed (wall clock) time (h:mm:ss or m:ss): 0:01.24