web版"湊發票計算器"經驗總結

故事背景

公司一直有這樣的報銷傳統:每個月加班一天報銷25塊錢,但是必須提供相應的發票。發票的規定有點奇葩,不能少於報銷金額,但是也不能多餘報銷金額+30.舉個例子,比如一個月加班10天,那麼可以報銷的金額是250元,需要提供的發票金額加起來必須在250-280之間。

旁邊的同事每個月都能搞到好多發票,各個金額都有。但是每次爲了把這些發票湊成合適的數字,都要花一些時間。

由此想到,如果要是能寫個代碼,來完成這項工作就好了。

這就是想寫一個“發票計算器”的動機。

開發思路

對於這種需求來說,最核心的部分肯定是寫一個正確、完善的湊數字的程序。
基本需求就是,有一組數,看他們有否任意組合,滿足湊成和在某個區間內的條件。
再之後,可以簡化爲,對於一個數組,寫出所有下標的組合。
列出來所有組合之後,在逐一組合檢查是否滿足“湊和”的條件。

於是問題轉換爲,給一個數組,列出來所有下標的組合。

起初想用c++ 來寫這個小工具,用 QT 套個殼。但是後來考慮到 QT 發佈 exe 不知道要趟多少缺少 dll 的坑,並且總不能誰需要就給誰手動拷貝個 exe,非常不利於推廣傳播。

因此,最終決定開發在 web平臺,算法和界面都用 javascript 來寫.最終把結果部署在我個人的服務器上。

這樣就比較方便使用、利於傳播了

經驗總結

關於web平臺

由於個人對 web 平臺 javascript 操作 dom不太熟悉,因此照着 w3school一點點寫了個簡陋的界面。嘗試用 js 動態添加、刪除 div.整個過程比想象的要順利得多。

並沒有採用 jQuery 以及各種前端框架,純手擼 html 和 javascript.

整體感覺下來,跟給遊戲寫 ui 思路幾乎一樣,甚至更簡單一些。

關於算法

算法本身比我想象得要複雜。我把我自己的思路寫到了代碼的註釋裏面。
可能遠遠達不到“最優解”,但是確實已經窮盡自己的智力極限了。

困難之處在於,由於得考慮各種各樣的組合,可能有兩個的組合,3個的組合,N個的組合。也就是說如果遍歷的話,可能需要寫的遍歷的層數是動態的。

這樣一來很容易就會想到遞歸求解。

但是及時想到了遞歸,依然沒有能夠快速把代碼寫出來。

這裏我就圖省事兒直接上圖吧。
湊發票算法圖解

打包發佈時遇到的問題

最終結果出來,本地測試運行良好.部署到我騰訊雲的 CentOS服務器上時,遇到了兩個小問題。

  1. 如何把本地文件上傳到服務器

  2. 上傳到服務器之後,原本正常的 html 網頁方問竟然是亂碼

成果展示

各種邊界條件都有處理,比如沒有輸入發票、輸入發票沒有解法時,都有對應的處理。
唯一已知但是沒有處理的是輸入沒有屏蔽非數字。
結果在這個鏈接

http://gj1111myl.cn/receipt

本來想貼一下代碼,但其實一共個3個文件,代碼也沒有加密。 chrome 瀏覽器打開上面的地址,直接用開發者工具就能看到了。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章