故事背景
公司一直有这样的报销传统:每个月加班一天报销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服务器上时,遇到了两个小问题。
-
如何把本地文件上传到服务器
-
上传到服务器之后,原本正常的 html 网页方问竟然是乱码
成果展示
各种边界条件都有处理,比如没有输入发票、输入发票没有解法时,都有对应的处理。
唯一已知但是没有处理的是输入没有屏蔽非数字。
结果在这个链接
本来想贴一下代码,但其实一共个3个文件,代码也没有加密。 chrome 浏览器打开上面的地址,直接用开发者工具就能看到了。