トップページに戻る
次の競技プログラミングの問題へ
前の競技プログラミングの問題へ
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;
}
}
解説
桁数は進数に対して、単調減少となります。