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

Рейтинг: 1Ответов: 1Опубликовано: 11.02.2023

Алгоритм составления слова выглядит следующим образом:

Пусть алфавит (абс), нумерация элементов алфавита начинается с единицы, то есть у а порядковый номер единица и тд

  • Номер обозначим N и положим N=321

  • n=количество элементов алфавита(3 в нашем случае)

  • k=количество элементов в слове

  • pos - i-индекс элемента алфавита

    N= n^(k-1)*pos1+n^(k-2)pos2+...+posk

Если k>n к1=к2*n+r;1<=r<=n

Говоря простыми словами, r- остаток от деления ki/n

Для нашего примера:

N=321=107*3=106*3+3=(35*3+1)*3+3=((11*3+2)*3+1)*3+3=(((3*3+2)*3+2)*3+1)*3+3=((3*3^2+2*3+2)*3+1)*3+3=((3*3^3+2*3^2+2*3+1)*3+3=3*3^4+2*3^3+2*3^2+3+3

Получим слово сббас

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

N=321

ost_list=[]
k1_list=[]
k1=int(N/countOfABC)
ost=int(N%countOfABC)

ost_list.append(ost)
k1_list.append(k1)


print(k1,"*",countOfABC,"+",ost)
dictK1=dict()

while k1>countOfABC:
    if ost==0:
        k1-=1
        ost=1*countOfABC
        ost_list.append(ost)
        k1_list.append(k1)
        print(k1, "*", countOfABC, "+", ost)
    ost = k1 % countOfABC
    ost_list.append(ost)
    k1 = int(k1 / countOfABC)
    k1_list.append(k1)
    print(k1, "*", countOfABC, "+", ost)

dictK1 = dict(zip(k1_list, ost_list))
listResverse=list(k1_list.__reversed__())

# for id in range(len(listResverse)):
#     for value in enumerate(listResverse):
#      print("(((",listResverse[id],"*",countOfABC,"+",dictK1[value],")*",countOfABC,"+",dictK1[value+1],")*",countOfABC
#           ,"+",dictK1[value+2],")*",countOfABC,"+",dictK1[value+3])

Ответы

▲ 1

Если я правильно понял, вам нужно что-то вроде Excel-овской нумерации колонок

def rep(N, al):
    res = ""
    N -= 1
    n = len(al)
    while N >= 0:
        res = alphabet[N % n] + res
        N  = N // n - 1
    return res

alphabet = "abc"
print(rep(321, alphabet))

>>> cbbac

Если нужна полученная формула:

def repp(N, al):
    res = ""
    s = ""
    N -= 1
    n = len(al)
    p3 = 0
    while N >= 0:
        res = alphabet[N % n] + res
        s = f'{N%n+1}*[{n}^{p3}] + ' + s
        N  = N // n - 1
        p3 += 1
    return res, s[:-3]

321 ('cbbac', '3*[3^4] + 2*[3^3] + 2*[3^2] + 1*[3^1] + 3*[3^0]')