參考 題型範例 - 全國高級中等學校技藝競賽平台 工業類

題目:小青的數學作業

問題描述
小青最近外務很忙,但是最近學校課業繁重,尤其是數學,計算作業特別多,請您寫一個程式,來幫她自動算她的數學計算作業。
輸入格式輸出格式
輸入僅能輸入一行需要小青計算的數學運算式,所有參與運算的數字需要介於 0 到 2
31-1 之間的整數。輸入的這一行數學運算式中,只能有 0~9、+、* 這 12 種字元。輸入長度最多 1,500 字元。
輸出也只有一行,包含一個整數,表示輸入這個數學運算式的運算結果。
注意:當運算結果長度大於 4 位時,只能輸出最後 4 位,前面的 0 不可以輸出(例如,當運算結果為 2020110000025 時,請輸出 25)。

程式功能要求:
請利用上述說明,寫一個程式,能完成以下功能要求:
(1) 能讓小青輸入需要計算的數學運算式(運算式只能有 0~9、+、* 這 12 種字元,輸入長度最多 1,500 字元)。
(2) 能將小青所輸入的數學運算式的運算結果正確顯示出來。
(3) 您的程式要能讓小青重複輸入數學運算式,當小青想要結束程式時,可以輸入@來結束。
程式執行範例:


範例一
輸入正確輸出
請輸入運算式:(輸入 @ 結束)
987654321*123456789+123456789
您輸入的數學運算式為:
987654321*123456789+123456789
運算結果 = 2058

範例二
輸入正確輸出
請輸入運算式:(輸入 @ 結束)
1+1*3+4
您輸入的數學運算式為:
1+1*3+4
運算結果 = 8

範例三
輸入正確輸出
請輸入運算式:(輸入 @ 結束)
4294967295*4294967295+123456789
您輸入的數學運算式為:
4294967295*4294967295+123456789
運算結果 = 3814

範例四(額外)
輸入正確輸出
請輸入運算式:(輸入 @ 結束)
10000000000000000+16*196572773
+2*17383*9*5928+27
    
您輸入的數學運算式為:
10000000000000000+5*629032879
+2*17383*9*5928+27
運算結果 = 27
    

執行結果


using System;
using System.Linq.Expressions;
using System.Numerics;
using System.Text.RegularExpressions;

class Program
{
    /// <summary>
    /// 將運算式分割成運算元與運算子
    /// </summary>
    /// <param name="expression">運算式</param>
    /// <returns>分割後的運算式</returns>
    static string[] SplitExpression(string expression)
    {
        // 使用正則表達式找出所有的數字和運算子
        MatchCollection matches = Regex.Matches(expression, @"\d+|[\+\*]");
        string[] elements = new string[matches.Count];
        int index = 0;
        foreach (Match match in matches)
        {
            elements[index] = match.Value;
            index++;
        }
        return elements;
    }

    /// <summary>
    /// 執行運算式的結果
    /// </summary>
    /// <param name="expression">運算式</param>
    /// <returns>執行結果</returns>
    static BigInteger EvaluateExpression(string[] expression)
    {
        BigInteger a, b;
        Stack<BigInteger> exp = new Stack<BigInteger>();
        for(int index=0; index<expression.Length; index++)
        {
            if (expression[index] == "*")//是運算元
            {
                a = exp.Pop();
                b = BigInteger.Parse(expression[++index]);
                exp.Push(a * b);
            }
            else
            {
                exp.Push(BigInteger.Parse(expression[index]));
            }
        }
        a = exp.Pop();
        while (exp.Count > 0)
        {
            b = exp.Pop();
            a += b;
        }
        return a;
    }

    static void Main()
    {
        while (true)
        {
            Console.WriteLine("請輸入數學運算式:(輸入 @ 結束)");
            string input = Console.ReadLine().Replace(" ", "");//防呆去空白;
            input = input.Replace(" ", "");//防呆去空白
            if (input == "@")
            {
                Console.WriteLine("程式結束,謝謝使用。");
                break;
            }
            try
            {
                string[] expression = SplitExpression(input);
                BigInteger result = EvaluateExpression(expression)%10000;
                Console.WriteLine($"妳輸入的數學運算式為:\n{input}\n運算結果 = {result}");
            }
            catch (Exception ex)
            {
                Console.WriteLine("發生錯誤:" + ex.Message);
            }
        }
    }
}