トップページに戻る    次の競技プログラミングの問題へ    前の競技プログラミングの問題へ

No.47 ポケットを叩くとビスケットが2倍

■■■問題■■■

Saraは、「ふしぎなポケット」を手に入れた。

「ふしぎなポケット」は、いくつかビスケットを入れて叩くと、入れたビスケットの数が2倍になる。

Saraは最初1枚のビスケットを持っていて、
「ふしぎなポケット」を使ってちょうどN枚のビスケットにして、全部食べたいと思っている。
(食べきれないので枚数をオーバーしてはいけない)

この時、ちょうどN枚にするには、Saraは最低何回ポケットを叩く必要があるか求めてください。

■■■入力■■■

N

Saraが食べたいビスケットの数N(1 <= N <= 1億) が与えられます。

■■■出力■■■

Saraが叩くポケットの最小回数を出力してください。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "InputX";

    static List<string> GetInputList()
    {
        var WillReturn = new List<string>();

        if (InputPattern == "Input1") {
            WillReturn.Add("3");
            //2
            //初めに1枚のビスケットをポケットに入れて叩きます。
            //すると、2枚のビスケットになります。
            //2枚のビスケットになったうちの1枚をポケットに入れて、もう一度叩くと合計で3枚になります。
            //よって、2回叩くと3枚になります。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("4");
            //2
            //初めに1枚のビスケットをポケットに入れて叩きます。
            //すると、2枚のビスケットになります。
            //2枚のビスケットをそのまま、もう一度叩くと合計で4枚になります。
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1000");
            //10
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        long N = long.Parse(InputList[0]);

        long Bekijyou = 1;
        int Cnt = 0;
        while (N > Bekijyou) {
            Bekijyou *= 2;
            Cnt++;
        }
        Console.WriteLine(Cnt);
    }
}


解説

食べたいビスケットの数に対して、
最も左のビットが落ちるまで2で割った回数が、解となります。