トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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で割った回数が、解となります。