白駿16676近右の日記


質問する


2018年が終わり2019年が近づいています
根祐は2019年には必ず日記を書くことにした.しかし、日記帳を書くのは初めてではないので、困ったときに目標年俸を日記帳の前に書くことにしました.
日記を書く人は知っているはずですが、きれいな日記の核心はシールです.そのため、根祐は手書きで目標年俸を使うのではなく、シールで目標年俸を貼りたいと思っている.目標年俸が100であれば[1][0][0].[1]は1と書かれたシールであり、他の数字についても同様のルールが適用される.
近宇は自分の年俸が一番高いのはNだと知っている.だから根佑はシールで0からNの数字を表現しようとした.最低価格Nが10であれば、製作過程は以下の通りである.
  • のシールスタックから[0]の1つを取得し、0([0])を表す.その後使用したシール[0]をシールスタックに戻します.
  • シールスタックから[1]は1を表す([1]).後に使用したシール[1]をシールスタックに戻します.
  • 9までの同様の方法で表現することができる.
  • シールスタックから[0]個と[1]個を取得し、10を表す([1][0]).次に使用するシール[0]および[1]をシールスタックに戻します.
  • したがって,n=10であれば,[0]から[9]までのシールが1つあればすべて表現できる.
    必要なシールを買うために高麗(コリョ)大学のある広場に到着した近宇は悩んだ.シールパックには[0]から[9]までシールが1枚しかなく、思ったより高い!
    だから根佑は最小限のシールマスクを買いたいと思っています.0からNまですべての数字を表現することができます.
    近宇は頭がいいのですが、シールパックの価格に衝撃を受けて計算できない状態に.
    友人たちは、根祐に最大の目標額Nをあげたら、根祐に必要な最小シールパックの個数を求めます.
    入力
    1行目には、右寄り年収の最低価格を表す整数Nが与えられる.(0 ≤ N ≤ 1,000,000,000)
    しゅつりょく
    1行目では、根佑がシールとして表現するために購入しなければならないシールパックの最低個数を0からNに出力する.
    入力例1
    88
    サンプル出力1
    2

    解法


    シールは11 11 11 11 11 11...すなわち、総桁数が1であれば、最小シールパックを1つ追加する.
    10日にはシールパックが1枚、11~110の間にはシールパックが2枚必要です.
    111~1110には3つのシールマスクが必要です.
    i 0から9の場合、Nがstart以上、end未満の場合にシールパッケージ変数が出力される.
    start変数は1から始まり、繰り返すほど現在の値に10を乗算し、さらに1を乗算します.
    2つ目の解釈はwhile文を用いて行われる.
    nがnum変数以上である場合、繰り返します.
    numは11から11111111に変わります.

    コード1

    N = int(input())
    sticker_pack = 1
    start = 1
    end = 11
    if N == 0:
        print(sticker_pack)
    else:
        for i in range(10):
            if start <= N < end:
                print(sticker_pack)
                break
            start = start * 10 + 1
            end = end * 10 + 1
            sticker_pack += 1
    

    コード2

    N = int(input())
    num = 11
    sticker_pack = 1
    while N >= num:
        num = num * 10 + 1
        sticker_pack += 1
    print(sticker_pack)
    
    白駿16676近右の日記