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

ABC-068-B Break Number

■■■問題■■■

高橋君は2で割れる数が好きです。

正整数Nが与えられるので、
1以上N以下の整数のうち、最も2で割れる回数が多いものを求めてください。
答えは必ず1つに定まります。

なお、2で割っていき、何回あまりが出ずに割れるかを、2で割れる回数と呼ぶことにします。

例えば
●6ならば、6 -> 3で、1回 2で割れます。
●8ならば、8 -> 4 -> 2 -> 1で、3回 2で割れます。
●3ならば、0回 2で割れます。

■■■入力■■■

N

●1 <= N <= 100

■■■出力■■■

問題の答えを出力する。


C#のソース

using System;
using System.Collections.Generic;

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("7");
            //4
            //4は2回 2で割ることができ、
            //これは 1, 2, ・・・ 7 の中で最も多いです。
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("32");
            //32
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("1");
            //1
        }
        else if (InputPattern == "Input4") {
            WillReturn.Add("100");
            //64
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        if (N >= 64) { Console.WriteLine(64); return; }
        if (N >= 32) { Console.WriteLine(32); return; }
        if (N >= 16) { Console.WriteLine(16); return; }
        if (N >= 8) { Console.WriteLine(8); return; }
        if (N >= 4) { Console.WriteLine(4); return; }
        if (N >= 2) { Console.WriteLine(2); return; }
        if (N >= 1) { Console.WriteLine(1); return; }
    }
}


解説

2の累乗数を列挙してます。