16953. A → B


質問が知りたい場合は、下のリンクをクリックしてください!
問題の本文

アクセスプロセス

  • の小数に2を乗じて、あるいは大きい数の中から1を減らして、2を除いて、もっと速いことができますか?
  • 2に分け、末尾が1の場合は1を抜きます.
  • 2 2を2で割らなければ整数Aは数えられないと判断し、−1を出力する.
  • 時間制限は2秒!価格は10億ウォン.
  • O(logn)の複雑さは解決できるでしょうか?
  • に答える

    import sys
    A, B = map(int, sys.stdin.readline().split())
    cnt = 0
    
    while B != A:                       # B가 A와 같아지거나, 혹은 조건을 만족시키지 못하게 된다면 탈출한다.
        if cnt == -1:                   # 탈출
            break
    
        if str(B)[-1] == '1':           # 마지막 숫자가 1인 경우
            B //= 10                    # 1을 제거해주어야 하는데, 문자열로 처리해서 슬라이싱할 수도 있지만
            cnt += 1                    # 1의 자리를 없애는 것이기에 10으로 나눈 몫으로 처리할 수도 있다.
            continue
    
        if B > 0 and B % 2 == 0:        # 0보다 크면서 2로 나누어떨어지는 경우 2로 나누어준다.
            B //= 2                     # 0보다 크다라는 조건을 넣은 이유는 B가 1이 될 때 B > 0 조건이 없다면
            cnt += 1                    # 위의 조건문에서 1이 없어지게 되고, 0이 되어서 B % 2 == 0의 조건에서 무한루프가 생긴다.
            continue
    
        cnt = -1
    
    print(cnt + 1) if cnt > 0 else print(-1)    # 불필요하게 쓴 것 같다. 처음부터 cnt에 1을 할당했다면 이렇게까진 하지 않아도 됬을텐데..

    まだまだ足りない
    方法が少し残念だったり、複雑度計算が間違っていたりします.
    コードをよく理解していないかもしれません.
    コメントに自由に意見や教えを残していただければ
    私の成長に大きな助けになります:)
    読んでくれてありがとう!