AtCoderのABC
次のABCの問題へ
前のABCの問題へ
ABC406-B Product Calculator
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("5 2");
WillReturn.Add("7 13 3 2 5");
//10
}
else if (InputPattern == "Input2") {
WillReturn.Add("2 1");
WillReturn.Add("2 5");
//1
}
else {
string wkStr;
while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
}
return WillReturn;
}
static void Main()
{
List<string> InputList = GetInputList();
decimal[] wkArr = InputList[0].Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
decimal K = wkArr[1];
decimal[] AArr = InputList[1].Split(' ').Select(pX => decimal.Parse(pX)).ToArray();
decimal Limit = 1;
for (int I = 1; I <= K; I++) {
Limit *= 10;
}
Limit--;
decimal CurrVal = 1;
foreach (decimal EachA in AArr) {
if (WillOverProd(CurrVal, EachA, Limit)) {
CurrVal = 1;
}
else {
CurrVal *= EachA;
}
}
Console.WriteLine(CurrVal);
}
// decimal型の2正数の掛け算が、Limitを超えるかを返す
static bool WillOverProd(decimal pA, decimal pB, decimal pLimit)
{
decimal Mod = pLimit % pB;
pLimit -= Mod;
return pA > pLimit / pB;
}
}
解説
WillOverProdメソッドでオーバフローを事前検知してます。