2013-12-19 5 views
0

Я пытаюсь найти решение проблемы, о которой я думал. У меня есть число перестановок из 26 символов с 6 возможными пятнами как 26^6 = 308 915 776. Я пытался сделать так, чтобы я мог сопоставить каждое число с уникальной комбинацией и быть в состоянии идти туда и обратно из комбинации на номер.Отображение уникальных комбинаций чисел

An example: 
1 = aaaaaa 
2 = aaaaab 
27 = aaaaba 

Можно ли написать полиномиальный алгоритм времени, который будет конвертировать между двумя и/или есть какие-либо эффективные примеры того, что я пытаюсь сделать.

ответ

2

Это просто базовое преобразование моего друга.

Поскольку вы не указали язык, ниже приведен псевдокод с индексированием массива и индексацией строк, начиная с 0, а присваивание: =.

, если вы позволите «а» 0, и «Z» быть 25, а затем преобразовать из основания 26 базировать 10:

total:= 0 
loop index from 0 to 5 
    temp:= 'z' - input[index] // Left to right. Single base 26 digit to base 10 
    total:= 26 * total + temp // Shift left and add the converted digit 
    increment index and goto loop start 

Чтобы вернуться к письмам (база 26) также легко:

result:= '' 
loop index from 0 to 5 
    temp:= 'a' + input mod 26 // Input modulus 26 is the base 26 digit to add next 
    result:= temp + result // Append current result to the new base 26 digit 
    input:= input div 26 // Divide input by 26, throw away the remainder 
    increment index and goto loop start 

Если вы хотите все это, чтобы быть 1, а затем добавьте после преобразования из основания 26 по основанию 10 и вычесть 1 до преобразования от основания 10 до основания 26. Лично я бы позволил все это будем 0.

1

Вы можете отобразить его с помощью указателей в двойной:

char *example = "abcdef"; 

double d = 0; 
char *p = (char *)&d; 
for (int i=0; i<6; i++) 
    p[i] = example[i]; 

// d is your code 

Это не так красиво и не 100% разрешено, но это работает.

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