バックアップ1038[削減|python]


質問する
非負の整数Xのビット数が最大ビット数から最小ビット数に減少した場合を減少ビット数と呼ぶ.例えば、321および950は減少した樹脂であるが、322および958ではない.プログラムを作成して、N回目に減らした数字を出力してください.0は0回目の減少数、1は1回目の減少数です.N回目の減少ができない場合は、−1を出力する.
入力
1行目はNです.Nは1000000以下の自然数または0である.
しゅつりょく
1行目はN回目に減少した数字を出力します.
入力例1
18
サンプル出力1
42
入力例2
0
サンプル出力2
0
入力例3
500000
サンプル出力3
-1
こんなに解けたわけではないはずです.
入ってきた数を混ぜ合わせて並べた後、減らした順に解くのが正解です.
しかし、ブルートフォースで当たった.
要するに、説明するならば、数桁の0番目のビットから1つずつ+1ビットに移動し、何か一致しない点があれば、コードを次の位置に移動し続ける.判別した数の間に333があれば340400まで上がるので、途中で再確認してみると340などの数字を外すことができます.組み合わせであれば9876543210、10桁なので2^10-1から9876543210まで出てきますが、この数字は減少した数の中で最大なので1023から-1を出力します.
import math


a = int(input())

i = 0
stop = 0
count = 0
while True:
  if a == 0:
    i=0
    break
  i= i+1
  if a > 1022:
    i=-1
    break
  else:
    length = len(str(i))
    k=0
    for j in range(0, length):
      if not str(i)[j:j+1] >= str(i)[j+1:j+2]:
        if i>10:
          i = math.ceil((i/10**(length-j-1)))*10**(length-j-1)
        break
        
    for j in range(0, length):
      if str(i)[j:j+1] > str(i)[j+1:j+2]:
        k+=1

    if k == length:
      count+=1
      #print("이게 i",i)
    if count == a:
      stop = 1

  if stop == 1:
    break

print(i)