Как найти конкретную цифру из большого числа и посчитать это?

Здесь я пытаюсь выяснить все 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

?>

1

Решение

Я думаю, что вы можете избежать преобразования строк, просто используя модуль.

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:

#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
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;
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, макс.), добавленная для примера
  • как вы можете видеть в списке $known (это верно для подсчета всех цифр, а не только 2), вы можете сделать это более разумно с помощью алгоритма, который разделяет огромные числа и заменяет «глупый» подсчет. взглянуть на функции, такие как log(), pow() для этой арифметики; подсказка: это немного похоже на преобразование чисел из одной системы счисления в другую
0
По вопросам рекламы [email protected]