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

No.49 算数の宿題

■■■問題■■■

太郎君は算数がとても苦手で、算数の宿題が出て困っています。
今日出た宿題は足し算と掛け算の問題で、明日までに解いていかなければならないので、
困っている太郎君の代わりに解いてあげてください。

太郎君の国では、足し算は'*'の記号で、また、掛け算は'+'の記号で表されます。
また、足し算と掛け算に優先度はなく、左から順番に計算します。

■■■入力■■■

S

1行目に、計算式を表す文字列Sが100文字以内で与えられます。
文字列はすべて '0'〜'9'、'*'、'+' のいずれかの文字で構成されます。
空白は含まず、2桁以上の数値が0で始まることはありません。
計算式が演算子から始まったり、演算子が2個連続するなどの不正な式が与えられることはありません。

■■■出力■■■

計算結果の値を出力してください。
計算結果の値が、10万を超えることはありません。
最後に改行してください。


C#のソース

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

class Program
{
    static string InputPattern = "Input1";

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

        if (InputPattern == "Input1") {
            WillReturn.Add("2*3");
            //5
            //太郎君の国では、記号'*'は足し算を表します。
            //2と3を足して5が解になります
        }
        else if (InputPattern == "Input2") {
            WillReturn.Add("6*7+2");
            //26
            //我々の世界の表記に直すと 6+7×2ですが、
            //優先度が無いため6と7を足してから2を掛けます
        }
        else if (InputPattern == "Input3") {
            WillReturn.Add("2497*3+4");
            //10000
        }
        else {
            string wkStr;
            while ((wkStr = Console.ReadLine()) != null) WillReturn.Add(wkStr);
        }
        return WillReturn;
    }

    static void Main()
    {
        List<string> InputList = GetInputList();
        string S = InputList[0];
        int[] ValArr = S.Split('+', '*').Select(X => int.Parse(X)).ToArray();

        int AppearOpeCnt = 0;
        int Answer = ValArr[0];
        foreach (char EachChar in S) {
            if (EachChar == '+') Answer *= ValArr[++AppearOpeCnt];
            if (EachChar == '*') Answer += ValArr[++AppearOpeCnt];
        }
        Console.WriteLine(Answer);
    }
}


解説

結合法則をふまえて、順に計算してます。