四則運算練習

題目要求html

update 2018-04-12

  • 增長測試功能(Beta)

輸入四則運算的規則和表達式,測試程序能夠自動判斷表達式是否符合規則java

輸入輸出示例:git

輸入:github

{
  "config": {
    "numberOfExpression": 30,
    "range": 30,
    "hasFraction": false,
    "hasMultipleAndDivide": true,
    "hasParentheses": true
  },
  "expressions": {
    "3 × ( 3 + 3 )": "18",
    "( 3 + 3 )": "6"
  }
}

輸入參數說明:
在config中:spring

  • numberOfExpression: 表達式的個數
  • range: 表達式中操做數的範圍
  • hasFraction: 是否包含分數(true:是,false:否)
  • hasMultipleAndDivide: 是否包含乘除法(true:是,false:否)
  • hasParentheses: 是否包含括號(true:是,false:否)

在expressions中express

  • key 表示 表達式
  • value 表示表達式的值

輸出:apache

{
  "config": {
    "numberOfExpression": 30,
    "range": 30,
    "hasFraction": false,
    "hasMultipleAndDivide": true,
    "hasParentheses": true,
    "hasNegative": false,
    "answer": false,
    "maxNumberOfOperation": 3
  },
  "results": [
    {
      "3 × ( 3 + 3 )": {
        "true": "符合要求的表達式"
      }
    },
    {
      "( 3 - 1 )": {
        "false": "題目中的乘除法不符合要求"
      }
    }
  ],
  "enough": false
}

輸出參數說明:json

  • config:和輸入的config同樣
  • results:裏面對每一個表達式正確與否進行了說明,key爲表達式,value中的key爲正確與否,value中說明了表達式不知足哪一個條件
  • enough: 表示是否生成了足夠多知足條件的表達式

RESTful接口地址(試用版)api

  • 接口方法類型:POST
  • 接口參數名:answer
  • 參數值:見輸入示例

update 2018-04-06

  • 增長多語言處理
    • 英語
    • 簡體中文
  • 結果頁面優化
  • 增長是否顯示答案選項

update 2018-04-04

  • 新增dev分支,用於平時開發,待測試穩定後merge到master分支上,目前服務器上運行的是master分支的內容
  • dev分支更新
    • 更新到Spring boot 2.0.0
    • 增長日誌處理
    • 增長異常處理

開發環境

說明

運行地址數組

接口地址

生成表達式接口方法

String generate(String configs)

入參,字符串類型,可配置項見配置參數:

{
  "numberOfExpression": "10",
  "range": "10",
  "hasFraction": "false",
  "hasMultipleAndDivide": "true",
  "hasParentheses": "false",
  "hasNegative": "true",
  "answer": "true"
}

返回:

[8 - 5 ÷ 6 × 9 = 0.5, 7 + 8 = 15.0, 9 × 9 = 81.0, 7 × 6 + 4 ÷ 7 = 42.57142857142857, 5 ÷ 7 - 4 = -3.2857142857142856, 2 - 9 - 1 + 1 = -7.0, 3 ÷ 2 × 6 = 9.0, 1 × 0 = 0.0, 4 × 3 = 12.0, 3 - 7 - 5 = -9.0]

答題(目前支持一題)接口方法

String answer(String expression)

入參:

4 × ( 9'1/7 - 5 ) ÷ 3

返回:

4 × ( 9'1/7 - 5 ) ÷ 3 = 5.523809523809524

獲取默認的配置項接口方法

String retrieveDefaultTemplate()

返回默認的JSON配置:

{
  "numberOfExpression": "10",
  "range": "10",
  "hasFraction": "false",
  "hasMultipleAndDivide": "true",
  "hasParentheses": "false",
  "hasNegative": "true",
  "answer": "true"
}

配置參數

  • -n 或 -number: 生成表達式個數
  • -r 或 -range: 控制題目中數值(天然數、真分數和真分數分母)的範圍,該參數能夠設置爲1或其餘天然數。該參數必須給定,不然程序報錯並給出幫助信息
  • -hf: 有無分數
  • -md: 是否有乘除法
  • -hp: 是否有括號
  • -hn: 有無負數
  • -as: 是否生成答案
  • 至少一個運算符,最多三個運算符

注: 解析命令行參數採用了JCommander進行解析。

生成表達式邏輯

最初想法,實際上是很簡單粗暴的,把要生成的運算式當作字符串,這個字符串中:

  • 運算符個數 = 運算數的個數 - 1 => 運算數 = 運算符個數 + 1
  • 開闢一個(運算符個數 + 運算數個數)大小的數組,遍歷數組中的每一個元素,偶數位置插入運算數,奇數位置插入運算符。
  • 若是有分數,則先隨機找一個分數可插入的位置,其餘的運算數插入位置可插分數或者整數。
  • 判斷是否有乘法和除法,若是有,則從{"+","-","x","÷"}中隨機找一個插入運算符位置中,若是沒有乘法和除法,
    則從{"+","-"}中隨機找一個插入運算符位置中。
  • 若是運算符爲除法且後面緊接的運算數爲0,則將0從新替換成一個不爲0的運算數。
  • 若是有括號,則判斷從第0個操做數到第n-1個操做數中隨機選一個操做數以前拼接一個"(", 假設拼接"("是第m個操做數,而後從第m+1個操做數到第n個操做數中隨機選一個操做數後面拼接")"

去重的邏輯

  • 將字符串表達式(中綴表達式)轉換成二叉樹,
    而後對這個二叉樹的左右子樹進行自定義排序,無論左右子樹如何轉換,它們最終都會被有序排序
    若是兩個表達式生成的二叉樹排序之後的字符串序列一致,則說明兩個式子是重複的。

計算邏輯

  • 將中綴表達式轉換爲後綴表達式,而後對後綴表達式進行計算
  • 計算過程當中,設置一個棧,操做數壓棧,遇到操做符,出棧兩個操做數進行計算結果再壓棧,最後棧剩下一個元素即爲結果。

代碼

參考文獻

相關文章
相關標籤/搜索