2014-09-11 5 views
3

Im пытается обрешетке программу, которая делает это: ABCDEFGHIJKLMNOPQRSTU VWXYZ AA AB AC AD .... ZZ AAA AAB AACПрограмма для преобразования чисел букв

Так я подошел к этому трудно выразить словами, но я Попробуем пояснить

Я попытался создать базовую систему 27 и сделать A представляют 1, B-> 2 C-> 3 и AA-> 28 Проблема в том, что каждые 27 букв, где я получаю @, представляющий 0 .

Я также пробовал сделать A представлять 0 и иметь базовую систему 26, но 27 был бы BA, когда мне это нужно, чтобы быть AA

public class aaa 
{ 
    public static void main(String args[]) 
{ 
    int counter=29; 
    for(int x=0;x<=counter;x++) 
    { 
     int quotient, remainder; 
     String result=""; 
     quotient=x; 

     while (quotient>0) 
     { 
      remainder=quotient%27; 
      result = (char)(remainder+64) + result; 
      quotient = (int)Math.floor(quotient/27); 

     } 
    System.out.print(result+ " "); 
      } 
    } 
} 

Это печатает ABCDEFGHIJKLMNOPQRSTU VWXYZA @ AA AB

Я хочу, чтобы программа, чтобы сделать это ABCDEFGHIJKLMNOPQRSTU VWXYZ AA AB AC

ответ

0

В начале, как и некоторые ответы уже упоминалось, есть 26 букв, поэтому использовать базовую систему 26, а не 27.

Кроме того, печать A как 0, вместо @, поэтому измените (char)(remainder + 64) на (char)(remainder + 65). Последнее, что вам нужно сделать, это изменить quotient = (int)Math.floor(quotient/27);, потому что вы хотите напечатать, что будет 0 в таком масштабе, так вычесть 1 из него и остановить цикл, когда фактор меньше 0.

public class HelloWorld{ 

    public static void main(String []args){ 
     int counter=59; 
     for(int x=0; x<=counter; x++) 
     { 
      int quotient, remainder; 
      String result=""; 
      quotient=x; 

      while (quotient >= 0) 
      { 
       remainder = quotient % 26; 
       result = (char)(remainder + 65) + result; 
       quotient = (int)Math.floor(quotient/26) - 1; 
      } 
      System.out.print(result+ " "); 
     } 
    } 
} 

Output (заметим, что также нет места при запуске выхода):

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC AD AE AF AG AH AI AJ AK AL AM AN AO AP AQ AR AS AT AU AV AW AX AY AZ BA BB BC BD BE BF BG BH 

Пс: Отметьте свой код правильно!

+0

Это тоже работает. благодаря – user2994363

2

Есть 26 букв от A до Z. Вашей системы базы 26, не 27.

Что вы, вероятно, хотите сделать это:

  • Начать x в 1, а не 0. Ваша система в настоящее время представляет 0 как пустую строку, которая может отбрасывать вас.

  • Возьмем частное и остаток по модулю 26, а не 27.

  • Добавить 65 (значение ASCII, для 'A') к остатку, а не 64 (значение ASCII для '@').

+0

Java использует Unicode, а не ASCII. 65 - один (для некоторых символов требуется два). Значение кодового блока UTF-16 для «A», 16-разрядное число. –

1

Есть 26 возможных букв, поэтому при использовании % и / операторов, используйте 26 в качестве делителя.

A должен представлять 1, либо последовательность была бы эквивалентна:

0 1 2 ... 25 00 01 02... 

Однако, мы должны были бы диапазон расчетов, чтобы быть в диапазоне 0-25.

С изменениями в вашем коде я начинаю с x как 1.

int counter=29; 
for(int x=1;x<=counter;x++) 
{ 

Позже в цикле while, я изменил его на do - петли while, и я вычесть 1 из quotient каждый раз, чтобы переместить домен из 1-26 в 0-25. Кроме того, я добавляю 65 ('A') в остаток, так что 0 отображается на 'A'.

do 
    { 
     remainder=(quotient - 1)%26; 
     result = (char)(remainder+65) + result; 
     quotient = (int)Math.floor((quotient - 1)/26); 
    } 
    while (quotient>0); 

Выход:

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z AA AB AC 
+0

Спасибо! Он отлично работал. Я должен был подумать об этом ха-ха. – user2994363

0

Создать массив символов, содержащий вам письмо, как char letters[] = new char[]{'A','B', ... }. напишите простой цикл, например do ... while(num > 0). Измените число с letters.length и добавьте полученный символ в StringBuilder. Разделите число на letters.length. Когда петля закончит отменять выход и вы закончите.

Update:

public class MagicNumbers 
{ 
    private static final char[] LETTERS = { '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z' }; 

    private static final int LLEN = LETTERS.length; 

    private static String toMagicString(final int num) 
    { 
     int temp = num < 0 ? -num : num; 

     StringBuilder strB = new StringBuilder(); 

     do 
     { 
      strB.append(LETTERS[temp % LLEN]); 
      temp /= LLEN; 
     } 
     while (temp > 0); 

     if (num < 0) 
     { 
      strB.append('-'); 
     } 

     return strB.reverse().toString(); 
    } 


    public static void main(final String[] args) 
    { 

     for (int i = -28; i < 29; i++) 
     { 
      System.out.println(toMagicString(i)); 
     } 

    } 

} 
0

От this question and its answers Я думаю, что есть более простой подход: преобразуйте число в базу 27, а затем замените каждый символ соответствующей буквой (как указано в комментарии Pshemo, вам нужно определить символ «нуль» ... I ' Предположим, что _ будет стоять на ноль). A HashMap будет содержать пользовательские символы, которые вы хотите использовать для печати номера.

import java.util.HashMap; 

public class BaseConverter 
{ 
    /** 
    * Converts an integer to base 27, and returns the string with the custom characters 
    * defined in the map. 
    */ 
    public static String convertToMyBase27(int a) { 
     HashMap<Character, Character> m = new HashMap<>(); 
     m.put('0', '_'); // Or another Zero character 
     m.put('1', 'A'); 
     m.put('2', 'B'); 
     m.put('3', 'C'); 
     m.put('4', 'D'); 
     m.put('5', 'E'); 
     m.put('6', 'F'); 
     m.put('7', 'G'); 
     m.put('8', 'H'); 
     m.put('9', 'I'); 
     m.put('a', 'J'); 
     m.put('b', 'K'); 
     m.put('c', 'L'); 
     m.put('d', 'M'); 
     m.put('e', 'N'); 
     m.put('f', 'O'); 
     m.put('g', 'P'); 
     m.put('h', 'Q'); 
     m.put('i', 'R'); 
     m.put('j', 'S'); 
     m.put('k', 'T'); 
     m.put('l', 'U'); 
     m.put('m', 'V'); 
     m.put('n', 'W'); 
     m.put('o', 'X'); 
     m.put('p', 'Y'); 
     m.put('q', 'Z'); 

     String ans = ""; 
     String s = Integer.toString(a, 27); 
     for(char c : s.toLowerCase().toCharArray()) { 
      ans += m.get(c); 
     } 
     return ans; 
    } 
} 
Смежные вопросы