AtCoder Beginner Contest 171 C問題

C問題

難易度:茶色

N番目のa~z、aa~zz、aaa~zzzといったアルファベットの並びを求めます。
まず適当に数字を渡されます。
そして数字に対応するアルファベットの並びを出力。

123456789 -> jjddja

アルファベットの文字数は i 個の場合、最大で26** i(の総和) 番目以内の並びになります。
N番目の並びの文字数を求めます。

その後、26で剰余を取得、26進数を求めるようにアルファベットの並びを導きます。

WA

しかしテストケースではWA。
どうやらzzやzzzといった桁数の境目がうまく処理できていなかった。

702 -> zz

とあるべきなのですが、

702 -> az

と表示されます。

702 / 26 = 27→N
剰余:0 → z

N(27) / 26 = 1→N
剰余:1 → a

これが原因。

解決策

y:25 / 26 の場合、商は0。
z:26 / 26 の場合、商は1。

25番目はyなのに、26番目は商が1となるため一桁追加でazとなります。
隣の番号なのにこれはおかしい。

これを防ぐために、最後のアルファベットがzの時限定で
N=N-1とします。

702 / 26 = 27 → N-1 → 26
剰余:0 → z

N(26) / 26 = 1→N
剰余:0 → z

これで無事通りました。

N = int(input())
c,I,ans = 0,1,[]
lis = 'abcdefghijklmnopqrstuvwxyz'
 
I_=0
while 26**I+I_<N:
  I_+=26**I
  I+=1
  
for i in range(I):
  N,mod = divmod(int(N),26)
  if mod == 0:
    N-=1
  #print('N',N)
  #print('mod',mod)
  ans.append(lis[mod-1])
 
ans.reverse()
print(''.join(ans))