2017-02-21 1 views
0

Я недавно задал вопрос об алгоритме, который генерирует 6 символов base36 строк из целых чисел. Он имеет ограничение на то, что первый и последний символ всегда должны быть буквой и что вся строка является верхним регистром.Модифицированный алгоритм base36 на базовый 10

Вот алгоритм:

String getId(int id) 
{ 
    String s = ""; 
    for(int i = 0; i < 6; i++) 
    { 
     int digit; 
     if((i == 0) || (i == 5)) 
     { 
      digit = (id % 26) + 10;   
      id /= 26; 
     } 
     else 
     { 
      digit = id % 36; 
      id /= 36; 
     } 

     // add the digit to the string: 
     if(digit < 10) 
      s = (char)('0' + digit) + s; 
     else 
      s = (char)('A' + (digit - 10)) + s; 
    } 
    return s; 
} 

Я пытаюсь создать метод, который переворачивает это. То есть Дана строка, такие как A0000K он вернется 10. Вот то, что я до сих пор:

static int getNumber(String id) { 
    int base = 36; 
    int result = 0; 
    int n = id.length(); 
    for (int i = 0; i < id.length(); i++) 
    { 
     n-=1; 
     int digit = Character.digit(id.charAt(i), base);   

     if(i == 0 || i == 5) { 
      result += digit * (Math.pow(base-10, n)); 
     } 
     else { 
      result += digit * (Math.pow(base, n)); 
     } 

    } 

    return result; 
} 

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

Может ли кто-нибудь помочь? Благодаря

+1

База отличается для разных цифр, вы не можете использовать pow. Наименьшая значащая цифра равна n * 1, вторая - n * 26, третья - n * 26 * 36. –

+1

Извините, не могли бы вы предоставить более подробную информацию? Не содержит ли инструкция if для первого и последнего символов, которые вычитают 10 из базового дескриптора? – sam

+0

Math.pow (база, n) что такое база, если вам нужно 26 * 36? –

ответ

0

Я хотел бы сделать что-то вроде этого, используя предположение о том, что строка длиной 6 символов для упрощения:

static int getNumber(String id) { 
    int sum = 0, val; 
    char current; 
    for(int i = 0; i < 6; i++) { 
     current = id.charAt(i); 
     val = ((int) current) - (int) 'A'; 
     if(val > 0){ 
      sum += (val + 10) * Math.pow(36,5-i); 
     } else { 
      sum += ((int) id.charAt(i)) * Math.pow(36,5-i); 
     } 
    } 
    return sum; 
} 

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

0

Будет легче, если вы перейдете от наименее значимого к самому значимому месту, отслеживая значение места каждой цифры/буквы.

Проверьте, не является ли каждый символ цифрой или буквой, а затем преобразовывается в номинальное значение. Цифры 0-9, буквы 10-35, за исключением 1-го и 6-го, где они стоят 10 меньше.

Умножьте значение номинальной стоимости по месту и добавьте результат. Увеличьте значение места путем умножения на 26 или 36 в зависимости от позиции.

static int getNumber(String id) { 
    int placevalue = 1; 
    int result = 0; 
    for (int i = id.length()-1; i >= 0; i--) 
    { 
     int facevalue; 
     if(Character.isDigit(id.charAt(i))) 
      facevalue = (int)id.charAt(i) - '0'; 
     else 
      facevalue = ((int)id.charAt(i) - 'A') + 10; 

     if(i == 0 || i == 5) { 
      result += (facevalue - 10) * placevalue; 
      placevalue *= 26; 
     } 
     else { 
      result += facevalue * placevalue; 
      placevalue *= 36; 
     } 
    } 

    return result; 
} 

Вышеупомянутые не делают валидации ввода. По крайней мере, вы должны проверить, что id.length равно 6.

Смежные вопросы