AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC414-C Palindromic in Both Bases
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("8");
WillReturn.Add("1000");
//2155
}
else if (InputPattern == "Input2") {
WillReturn.Add("8");
WillReturn.Add("999999999999");
//914703021014
}
else if (InputPattern == "Input3") {
WillReturn.Add("6");
WillReturn.Add("999999999999");
//283958331810
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
long Sinsuu = long.Parse(InputList[0]);
long Limit = long.Parse(InputList[1]);
long Answer = 0;
// 1桁の数
for (long I = 1; I <= 9; I++) {
string CurrVal1 = I.ToString();
long OddVal = long.Parse(CurrVal1);
if (OddVal > Limit) break;
string Change10BaseStr = Change10Base(OddVal, Sinsuu);
if (IsKaibun(Change10BaseStr)) {
Answer += OddVal;
}
}
for (long I = 1; I < long.MaxValue; I++) {
string wkStr1 = I.ToString();
string wkStr2 = GetRevStr(I.ToString());
string EvenStr = wkStr1 + wkStr2;
long EvenVal = long.Parse(EvenStr);
if (EvenVal > Limit) break;
string Change10BaseStr = Change10Base(EvenVal, Sinsuu);
if (IsKaibun(Change10BaseStr)) {
Answer += EvenVal;
}
for (long J = 0; J <= 9; J++) {
string OddStr = wkStr1 + J.ToString() + wkStr2;
long OddVal = long.Parse(OddStr);
if (OddVal > Limit) break;
string Change10BaseStr2 = Change10Base(OddVal, Sinsuu);
if (IsKaibun(Change10BaseStr2)) {
Answer += OddVal;
}
}
}
Console.WriteLine(Answer);
}
////////////////////////////////////////////////////////////////
// string型を引数とし、reverse
////////////////////////////////////////////////////////////////
static string GetRevStr(string pStr)
{
char[] wkArr = pStr.ToCharArray();
Array.Reverse(wkArr);
return new string(wkArr);
}
////////////////////////////////////////////////////////////////
// string型を引数とし、回文判定を行う
////////////////////////////////////////////////////////////////
static bool IsKaibun(string pStr)
{
int UB = pStr.Length - 1;
for (int I = 0; I <= UB / 2; I++) {
int PairInd = UB - I;
if (pStr[I] != pStr[PairInd]) {
return false;
}
}
return true;
}
////////////////////////////////////////////////////////////////
// 10進数をK進数に変換して返す
////////////////////////////////////////////////////////////////
static string Change10Base(long pDecVal, long pK)
{
if (pDecVal == 0) return "0";
var ModList = new List<long>();
while (pDecVal > 0) {
long Mod = pDecVal % pK;
ModList.Add(Mod);
pDecVal /= pK;
}
ModList.Reverse();
var sb = new System.Text.StringBuilder();
ModList.ForEach(pX => sb.Append(pX));
return sb.ToString();
}
}
解説
奇数長の10進回文と
偶数長の10進回文を列挙し、
進数変換しても回文かをチェックしてます。