Почему quot нужно многократно вычитать на 1?

Этот вопрос основан на этой теме Загадка программирования: как преобразовать имя столбца Excel в число?

Вот код из этого вопроса для перевода номера столбца в имя столбца excel

public String getColName (int colNum) {

   String res = "";
   int quot = colNum;
   int rem;        
    /*1. Subtract one from number.
    *2. Save the mod 26 value.
   *3. Divide the number by 26, save result.
   *4. Convert the remainder to a letter.
   *5. Repeat until the number is zero.
   *6. Return that bitch...
   */
    while(quot > 0)
    {
        quot = quot - 1;
        rem = quot % 26;
        quot = quot / 26;

        //cast to a char and add to the beginning of the string
        //add 97 to convert to the correct ascii number
        res = (char)(rem+97) + res;            
    }   
    return res;
}

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

            quot = quot - 1;

Насколько я понимаю, цитата необходима для сопоставления номера столбца с расстоянием от «а». Это означает, что 1 должно сопоставляться с 0 расстоянием от «а», 2 с 1 расстоянием от «а» и так далее. Но разве вам не нужно вычесть это один раз, чтобы учесть это? Не в петле, я имею в виду, в конце концов,

            quot = quot / 26;

остановит цикл.


person committedandroider    schedule 23.01.2015    source источник
comment
Предположительно исходное значение было сформировано путем объединения значений в диапазоне 1..26, а не 0..25.   -  person Hot Licks    schedule 24.01.2015
comment
но это 0...25, потому что вы выполняете эту операцию rem+97, расстояние от 'a'.   -  person committedandroider    schedule 24.01.2015


Ответы (1)


Столбцы Excel не являются обычной системой счисления. Это не просто основание 26. Первый двузначный столбец — «AA». В любой нормальной системе счисления первые двузначные числа состоят из двух разных цифр. В принципе, в нумерации столбцов Excel нет «нулевой» цифры.

Чтобы учесть эту разницу, на каждой итерации вычитается 1.

person recursive    schedule 23.01.2015
comment
Я согласен с нулевой цифрой. Вот почему я понимаю, что если вы передаете 26, вычтите это на 1, чтобы получить 25, расстояние от «а». Но разве это не будет все время, когда вам нужно это делать? Для меня вам нужно учитывать это только на 1 раз. Вы можете это прояснить? - person committedandroider; 24.01.2015
comment
Как вы представляете расстояние 26 в столбцах Excel? Это АА. Первый A вносит ненулевое расстояние, но второй A действует как конечный нуль. Во всех местах, кроме последнего, A означает некоторое положительное значение. Вычитание единицы исправляет это. - person recursive; 24.01.2015
comment
То, как я вижу, это расстояние в базе 26. Видя, что 26/26 != 0, это означает, что для представления этого расстояния потребуется еще одна степень числа 26. Вот почему quot = quot/26 имеет для меня смысл. Что не имеет смысла, так это то, что на следующем проходе quot будет равно 1. Если я уже позаботился о нумерации excel, основанной на нуле, зачем мне снова вычитать 1? - person committedandroider; 24.01.2015
comment
Правильный вывод для 27 - это аа. Если вы не вычтете 1 на следующей итерации, вы получите ab. Другими словами, вы еще не позаботились о нумерации Excel. Об этом нужно заботиться на каждой итерации, и вы никогда не закончите заботиться об этом, пока цикл не завершится. - person recursive; 24.01.2015
comment
Я понимаю, что это необходимо для получения правильного результата. Я просто не понимаю, зачем это нужно на каждой итерации из интуиции. - person committedandroider; 24.01.2015
comment
Это не обычная система счисления, в которой каждая цифра имеет определенное значение, поэтому вы не можете рассчитывать на применение стандартного алгоритма базового преобразования. - person recursive; 24.01.2015
comment
Итак, интуитивно, когда я делаю 26/26 и получаю 1, просто помните, что у этого 1 также есть собственное установленное значение в именовании столбцов Excel? - person committedandroider; 24.01.2015