这个作业属于哪个课程 | 信安1912-软件工程 (广东工业大学 - 计算机学院) |
---|---|
这个作业要求在哪里 | 成对作业 |
这个作业的目标 | 实现4则运算 |
队友 | 祥梓刘 |
Github链接
PSP表格PSP 各个阶段 | 自己预估的时间(分钟) | 实际的记录(分钟) |
---|---|---|
计划: 明确需求和其他因素,估计以下的各个任务需要多少时间 | 10 | 20 |
开发 (包括下面 8 项子任务) | (以下都填预估值) | 380 |
需求分析 (包括学习新技术) | 20 | 25 |
生成设计文档 | 10 | 15 |
设计复审 | 0 | 0 |
代码规范 | 0 | 0 |
具体设计 | 10 | 15 |
具体编码 | 240 | 300 |
代码复审 | 0 | 0 |
测试 | 10 | 5 |
报告 | 0 | 0 |
测试报告 | 0 | 0 |
计算工作量 (多少行代码,多少次签入,多少测试用例,其他工作量) | 0 | 0 |
事后总结, 并提出改进计划 (包括写文档、博客的时间) | 20 | 20 |
总共花费的时间 (分钟) | 310 | 380 |
整体流程
用户使用流程
在集成环境中执行main.py
在命令行提示下完成操作
算法流程
算法设计
算法具体设计
本项目在通过数据结构栈实现4则运算的基础上采用了一种新的判断等式是否重复的方法,相较于之前笨重且消耗性能巨大
的判断算法,本算法大大节约了算法在判断重复等式的性能,使整个算法的性能提升不少。
该判断等式重复的算法基于一个大的假设:
如果我们将随机数采样近似看成均匀采样即每一个数被采样的概率相同,则可以把其看成是一个古典概型,假设所取的自然数范围为1-n+1,即n个数,则采样得到的两个数相同的概率为
若是参与运算的数字个数为k且相互之间为独立事件,则k个数相同的概率分布服从一个伯努利分布(X1~(p1,k)),则其概率为
再假设运算符(+,-,*,/)个数为j,且两两相互为独立事件,则可知两个运算符相同的概率为
故可知j个运算符相同服从伯努利分布(X2~(p2,j))则j个运算符相同的概率为
再假设运算数与运算符之间独立,则k个运算数相同且j个运算符相同的概率P’为
而实际中还需要考虑括号的位置及运算符的位置,可知两个等式完全相同的概率P’’一定小于P’,我们将P’’放缩成P’,即将P’’近似成P’。现在我们知道一个等式完全相同的概率为P’,继续假设u个等式完全相同的概率服从伯努利分布(X3~(P’,u)),则可算出u个等式有v个等式完全相同的概率为
现在我们举一个例子:假设所取自然数范围为1-10(n=10),运算数个数为2,运算符个数为1,等式个数为10,则10个等式中有两个等式相同的概率为
通过十几个样点的采样我们可以通过采样得到的样点来近似一个离散的分布函数再将其乘于10^13,将得到的函数向下取整作为近似我们判断等式相同的次数的函数
其中a=32000000,k表示运算数个数,j表示运算符个数,v表示有多少个等式相同,n表示运算数取值范围,u表示等式个数
通过这个判断等式相同的次数的函数便可灵活地调制每次生成算式时需要进行多少次判断。
由于时间有限,没能实现不出现负数及将小数转换为真分数的功能,后续如果有时间会继续完善
小结一个人打码真的好快乐捏!
呜呜呜呜我也想要队友啊