PHP: Как вывести список следующим образом: AA, AB, AC, вплоть до ZZZY, ZZZZ, ZZZZA и т. Д. - PullRequest
5 голосов
/ 05 апреля 2011

Я пытаюсь написать функцию, которая преобразует целое число в строку, как эта, но я не могу понять логику ...: (

1 = a
5 = e
27 = aa
28 = ab
etc...

Кто-нибудь может помочь? Я очень расстроен, что не могу понять, как это написать ...: (

Ответы [ 5 ]

19 голосов
/ 05 апреля 2011

Длинный список из них здесь :

/*
 * Convert an integer to a string of uppercase letters (A-Z, AA-ZZ, AAA-ZZZ, etc.)
 */
function num2alpha($n)
{
    for($r = ""; $n >= 0; $n = intval($n / 26) - 1)
        $r = chr($n%26 + 0x41) . $r;
    return $r;
}

/*
 * Convert a string of uppercase letters to an integer.
 */
function alpha2num($a)
{
    $l = strlen($a);
    $n = 0;
    for($i = 0; $i < $l; $i++)
        $n = $n*26 + ord($a[$i]) - 0x40;
    return $n-1;
}
6 голосов
/ 05 апреля 2011

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

Обычная первая реакция, когда сталкиваешься с этой проблемой, это думать "Есть 26 букв, поэтомуэто должно быть основание-26! Все, что мне нужно сделать, это сопоставить каждую букву с соответствующим номером ".

Но это не база-26. Легко понять, почему: нуля нет!

В базе 26 число двадцать шесть является первым числом с двумя цифрами и записывается как «10».В этой системе подсчета двадцать шесть имеет одну цифру «Z», а первое двузначное число - двадцать семь.

Но что если мы сделаем A = 0, ..., Z =25?Таким образом, у нас есть ноль, и первое двузначное число становится двадцать шесть.Все идет нормально.Как мы пишем двадцать шесть сейчас?Это "АА".Но ... не А = 0?По электронной почте Ой!A = AA = AAA = "0" = "00" = "000".

0 голосов
/ 27 января 2013
void convert(int number)
{

        string str = "";

    while(number)
    {
        char ch;
        ch = (number - 1) % 26 + 65;    
        str = ch + str;
        number = (number-1) / 26;
    }

    cout << str << endl;
}
0 голосов
/ 05 апреля 2011

Вам нужно будет использовать base_convert для преобразования ваших чисел в базу 26:

base_convert(35, 10, 26);

Это дает вам отдельные компоненты в числах от 1 - p, поэтому 35становится 19 (1 * 26 + 9).Затем необходимо сопоставить отдельные компоненты с требуемым набором, поэтому 1 => a, 9 => i, a => j и т. Д. И 19 становится ai.

0 голосов
/ 05 апреля 2011

Ну, вы в значительной степени конвертируете из базы 10 в базу 26. База 10 имеет цифры 0-9, тогда как база 26 может быть выражена с помощью "цифр" A-Z. Преобразование из базы-10 легко - см., Например, это: http://www.mathsisfun.com/base-conversion-method.html Изменить: на самом деле, base-26 не в состоянии объяснить несколько эквивалентных способов записи 0 (0 = 00 = 000).

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