Лучший способ справиться с числами?Получение и изменение отдельных цифр - PullRequest
2 голосов
/ 01 августа 2011

Я хочу взять цифру от 1 до 17, а затем провести ее через серию логических циклов, которые изменят различные цифры номера. Я должен быть в состоянии сделать следующее:

1) Быстрый способ узнать, сколько цифр в номере. Есть ли хороший (эффективный) php метод для этого? Является ли получение базы 10 лучшим способом? Или, может быть, превратить его в строку и попросить длину?

2) Далее мне нужно знать, какой номер есть в каждой цифре. Должен ли я просто продолжать делать% 10 для числа, чтобы анализировать каждую цифру (это также поможет решить проблему номер 1, добавив счетчик в цикле)?

3) Наконец, мне нужен хороший способ изменить различные цифры номера. Должен ли я использовать регулярные выражения? Или мне просто создать новый номер, сложив вместе разные числа, каждый из которых представляет цифру (например, 1 + 30 + 400 + 2000 + 6000 = 62431)? Думаю, я мог бы также настроить исходное число таким же способом, как в предыдущем примере, добавив / вычтя из него, чтобы настроить каждую цифру на ту, которую я хочу.

Пожалуйста, дайте мне знать о других способах решения моей проблемы, если вы чувствуете, что они быстрее. Эффективность - это ключ.

Ответы [ 2 ]

1 голос
/ 01 августа 2011

Я решил написать ответ, потому что принятый в настоящее время просто неверен.Относительная точность чисел double имеет порядок 1E-16.Это не ограничение PHP, это внутренняя особенность IEEE 754 double.Следовательно, если вы хотите манипулировать 17-й цифрой двойного числа, независимо от того, какова величина числа, использование журналов и выполнение арифметических операций не подойдет.Что вам нужно сделать, это преобразовать число в строку, манипулировать цифрами в строке и отобразить ее из строки, не преобразовывая ее обратно в double.

0 голосов
/ 01 августа 2011

Вы можете изменить значение цифры в числе следующим образом:

function numlen($number) { return strlen($number); }

function numAt($number, $index) { return substr($number, $index, 1); }

function changeNumAt($number, $index, $newDigit) {
    return substr_replace($number, $newDigit, $index, 1);
}

Для вашей ситуации использование числа в качестве строки для одноразового изменения числа наиболее целесообразно.Чтобы сэкономить время, если вы будете менять несколько цифр, вы должны разобрать номер в массив цифр.Дайте мне знать в комментариях, если вам нужна помощь в этом.


Простой пример сравнительного анализа:

$start = microtime(true); //Log the start timestamp (including microseconds)
//Do stuff to benchmark
$end = microtime(true); //Log the end timestamp (including microseconds)
echo ((string)($end-$start))."seconds \n";

Используйте microtime(true), чтобы получить метку времени с микросекундами в качестве числа с плавающей запятой(это то, что правда).Получите время до и после действия и вычтите их, чтобы получить общее время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...