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

No.395 永遠の17歳

■■■問題■■■

17歳です! (ただしX進表記で)

10進表記で実年齢がA歳のアイドルがいます。
17歳(ただしX進表記) と表記できるような最小の正整数 (X >= 2) を求めてください。
そのようなXが存在しない場合は、-1を出力してください。

■■■入力■■■

A

入力は整数で、次を満たします。
0 <= A <= 100

■■■出力■■■

17歳 (ただしX進表記) と表記できるような
最小の正整数 X (X>=2) を求めてください。
そのようなXが存在しない場合は、-1を出力してください。


C#のソース

using System;
using System.Collections.Generic;
using System.Linq;

class Program
{
    static string InputPattern = "InputX";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("51");
            //44
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            //-1
            //3歳のアイドルは17歳を名乗ることはできません
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("15");
            //8
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

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

        int AnswerX = -1;
        bool HasAnswer = false;

        for (int X = 2; X < int.MaxValue; X++) {
            List<int> NumList = DeriveNumList(X, A);

            //桁数は進数に対して、単調減少なので、
            //2桁未満になったら、17にはならない
            if (NumList.Count < 2) break;

            if (NumList.Count > 2) continue;

            int Keta10 = NumList[0];
            int Keta1 = NumList[1];

            if (Keta10 != 1) continue;
            if (Keta1 != 7) continue;
            HasAnswer = true;
            AnswerX = X;
        }
        if (HasAnswer) Console.WriteLine(AnswerX);
        else Console.WriteLine(-1);
    }

    //N進数での数字の並びを返す
    static List<int> DeriveNumList(int pShinsuu, int pVal)
    {
        var WillReturn = new List<int>();

        do {
            int ModVal = pVal % pShinsuu;
            WillReturn.Add(ModVal);
            pVal /= pShinsuu;
        } while (pVal > 0);

        WillReturn.Reverse();
        return WillReturn;
    }
}


解説

桁数は進数に対して、単調減少となります。