Пользователь вводит алфавит, в котором не должны содержаться одинаковые буквы, также вводится номер, по этому номеру необходимо составить слово
Алгоритм составления слова выглядит следующим образом:
Пусть алфавит (абс), нумерация элементов алфавита начинается с единицы, то есть у а порядковый номер единица и тд
Номер обозначим 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])
Ответы (2 шт):
Если я правильно понял, вам нужно что-то вроде 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]')
ABC=input("Введите алфавит:\n")
ABC_Work=(ABC.upper())
ABC_Result1=" "
for char in ABC_Work:
if char not in ABC_Result1:
ABC_Result1+=char
ABC_Result=ABC_Result1.replace(" ","")
if ABC_Result.isalpha()!=True:
raise ValueError("В алфавите должны содержаться только буквы!")
dictionary = dict()
for i in range(len(ABC_Result)):
dictionary[ABC_Result[i]] = i + 1
N =int(input("Введите номер:\n"))
countOfABC = len(ABC_Result)
ost_list = []
k1_list = []
k1 = N
k1_list.append(k1)
list_base = []
list_base.append(f"{N}")
if N==0:
raise ValueError("Пустое слово!")
while k1 > countOfABC:
if (k1 % countOfABC) == 0:
k1 = int((k1 - countOfABC) / countOfABC)
ost = countOfABC
ost_list.append(ost)
k1_list.append(k1)
list_base.append(f"{k1}*{countOfABC}+{ost}")
continue
ost = k1 % countOfABC
ost_list.append(ost)
k1 = k1 // countOfABC
k1_list.append(k1)
list_base.append(f"{k1}*{countOfABC}+{ost}")
kk = k1_list[-1]
s = f"((({kk}"
for i in range(len(ost_list) - 1, -1, -1):
s += f"*{countOfABC}+{ost_list[i]})"
count = s.count("*")
s1 = f""
ost_list.append(k1)
dictNumber = dict()
for i in range(len(ABC_Result)):
dictNumber[i + 1] = ABC_Result[i]
string = ""
for i in range(len(ost_list) - 1, -1, -1):
string += f"{dictNumber[ost_list[i]]}"
s1 += f"{ost_list[i]}*{countOfABC}^{count}+"
count -= 1
print("=".join(list_base), "=", s, "=", s1[:-1], "=", string)