AtCoderのPAST    次のPASTの問題へ    前のPASTの問題へ

第14回PAST B 小数点第D位


問題へのリンク


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("1");
            WillReturn.Add("1.2");
            WillReturn.Add("1.8");
            //3.0
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("3");
            WillReturn.Add("1.234");
            WillReturn.Add("7.890");
            //9.124
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("4");
            WillReturn.Add("1.2345");
            WillReturn.Add("8.7655");
            //10.0000
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    // 値[10の指数]なDict
    static Dictionary<int, int> mValDict = new Dictionary<int, int>();

    static void Main()
    {
        List<string> InputList = GetInputList();

        char[] ACharArr = InputList[1].ToCharArray();
        char[] BCharArr = InputList[2].ToCharArray();

        SetSeisuubu(ACharArr);
        SetSeisuubu(BCharArr);

        SetSyousuubu(ACharArr);
        SetSyousuubu(BCharArr);

        // 繰り上がりの対応
        int[] KeysArr = mValDict.Keys.ToArray();
        Array.Sort(KeysArr);

        foreach (int EachKey in KeysArr) {
            int Nextkey = EachKey + 1;

            if (mValDict[EachKey] >= 10) {
                if (mValDict.ContainsKey(Nextkey) == false) {
                    mValDict[Nextkey] = 0;
                }
                mValDict[Nextkey] += mValDict[EachKey] / 10;
                mValDict[EachKey] %= 10;
            }
        }

        foreach (var EachPair in mValDict.OrderByDescending(pX => pX.Key)) {
            Console.Write(EachPair.Value);
            if (EachPair.Key == 0) {
                Console.Write('.');
            }
        }
        Console.WriteLine();
    }

    // charの配列を引数として整数部を設定する
    static void SetSeisuubu(char[] pCharArr)
    {
        int DotInd = Array.IndexOf(pCharArr, '.');

        int Shisuu = 0;
        for (int I = DotInd - 1; 0 <= I; I--) {
            if (mValDict.ContainsKey(Shisuu) == false) {
                mValDict[Shisuu] = 0;
            }
            mValDict[Shisuu] += pCharArr[I] - '0';
            Shisuu++;
        }
    }

    // charの配列を引数として小数部を設定する
    static void SetSyousuubu(char[] pCharArr)
    {
        int DotInd = Array.IndexOf(pCharArr, '.');

        int Shisuu = -1;
        for (int I = DotInd + 1; I <= pCharArr.GetUpperBound(0); I++) {
            if (mValDict.ContainsKey(Shisuu) == false) {
                mValDict[Shisuu] = 0;
            }
            mValDict[Shisuu] += pCharArr[I] - '0';
            Shisuu--;
        }
    }
}


解説

値[10の指数]なDictで
ナイーブに実装してます。