Почему мой php-код зацикливается бесконечно? - PullRequest
0 голосов
/ 10 сентября 2011

У меня есть функция GetLetters, которая возвращает

  1. a, когда я ее даю 1

  2. b, когдаЯ даю это 2

  3. z, когда я даю это 26

  4. aa, когда я даю это 27

  5. ab когда я даю его 28

По сути, вы поймете, что это мое решение, но оно зацикливаетсянеопределенно, когда я задаю любое значение ввода выше 26, кто-нибудь знает, что с ним не так?

function GetLetter($amt){
    if($amt<=26){
        return strtolower(chr(64+$amt));
    }
    $letters=array();
    while(true){
        $quotient=$amt%26;
        array_unshift($letters,GetLetter($quotient===0?26:$quotient));
        $amt=floor(($amt-1)/26);
        if($amt===0){
            break;
        }
    }
    return implode("",$letters);
}

Ответы [ 4 ]

4 голосов
/ 10 сентября 2011

См. здесь , вы сравниваете поплавки. Попробуйте intval().

Так что измени

if($amt===0){

до

if(intval($amt)==0){
3 голосов
/ 10 сентября 2011

Я думаю, floor возвращает float, и вы используете ===, а не == для сравнения с целым числом (0), поэтому float (0) === int (0) всегда false.

2 голосов
/ 10 сентября 2011

Так же, как альтернативный способ сделать это (заметьте, что это O (n)):

function getLetters($n) {
    for ($chr = 'a'; --$n;) ++$chr;
    return $chr;
}

(Если вы увеличиваете символ в PHP, он сначала будет идти с a..z, затем aa..zz и так далее, как вам нужно.)

1 голос
/ 10 сентября 2011

Всякий раз, когда вы используете оператор повторения, такой как оператор while, вы не должны использовать тип float для определения конца повторения.Числа с плавающей точкой никогда не бывают абсолютно точными, поэтому они не идеальны для операторов условий.

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