β

原创开源 VB 小程序: 质数判断(因数分解)

闪星空间 580 阅读

2014-9-7 P.S.更新 v3.5 版。(本文原发布日期为8月3日)

这是一个判断一正整数(1 除外)是否为质数的程序。

写这个程序缘由是有关参加本省数学竞赛的,即 2014 年湖南省高中数学竞赛中一道选择题中要判断 2011 是否为质数。虽然我当时就觉得是质数,但是仍不能确定,于是就产生了写程序求证的想法。想法很好,我有时候就是缺想法。本着脚踏实地从基层干起,将基本数学方法编程的理念,我写了这个程序。前后共有 3 个版本。原来一个看似简单的程序也并不简单,或许是我有点晕影响了智力发挥?

v1.0

质数判断 v1.0 界面

这是最初的版本。

我考虑到要判断一个数 n 是否为质数,只需看没有还是有两个因数 a,b 相乘等于 n 就行了。我设了两个变量,并且很“聪明”地设定循环使 2≤a≤根号n,然后嵌套循环内使 2≤a≤n/a;但是我当时显然没有意识到,有一种更快更简单的方法能让我避免如此繁冗计算“趋近” n 的。

质数判断 v1.0 的错误界面

这样造成,程序运行得很费劲;更糟糕的是,n 的范围被限制得致命地小!(不能超过 65533!)

下载地址:https://github.com/shansing/pnj/archive/v1.0.zip 【是的,此项目托管在 GitHub 了(主页在这儿,似乎让 GitHub 大材小用了。】

v2.0

质数判断 v2.0 界面

还好,之后我意识到了所犯错误,于是修改了算法;第二版诞生了。

显然,要找出假定的两个正整数 a,b 使得 a*b=n,只要设定循环使 2≤a≤根号n,再令 b=n/a 判断 b 是整数与否就好了。

改进之后,速度有了大幅提升。n 的支持的范围也更广了;不过它受到 VB 的限制,精确的话只支持 15 位及以内的整数——但这相比前一版,显然也是个飞跃了。这一版的 BUG 是,n 很大时,进度条会出现问题。

下载地址:https://github.com/shansing/pnj/archive/v2.0.zip

v3.0

质数判断 v3.0 界面

我当时也没想到会有这第三版。

不久我发现,输出结果太繁琐,不如写成一个 n 等于其所有质因数之积的等式。于是,“质数判断”实际上变成了“因数分解”。

在核心算法没变的基础上,此程序的处理速度居然也大幅提升了,这又给了我一个启示。

下载地址:https://github.com/shansing/pnj/archive/v3.0.zip

v3.5

质数判断 v3.5 界面

再不久,我又发现,将窗口最小化时程序处理得要快很多。经探究,此乃进度条绘制的问题。于是重写之,速度当即大幅提升。顺便还调整了一下界面布局。

因为没有改动核心算法,故不增加主版本号。

下载地址:https://github.com/shansing/pnj/archive/v3.5.zip

关于因数分解

这个程序的算法显然最多只算得上是中学水平。对于大整数的因数分解,还有更加高级好用的算法呢。详见维基百科整数分解词条。

关于我与 VB6

又显然,VB6 在当今时代显得有些“日薄西山”了。因而我也正在寻找其替代品。

我找到了快手(AAuto)。它像 VB 一样轻巧,有着与 VB 相似的代码风格,但更加灵活:我相信它绝对不会只是个替代品。其作者系国人,AAuto 是免费开源的,使用它也符合我的理想宗旨。于是我准备要学习 AAuto 了

我的 VB 程序中还有一个大作(误)叫“教室小管家”,找个时间将它发布了吧。VB 生涯该结束了。

插话一句:图片的位置问题留待稍候解决,造成的不便敬请谅解。

作者:闪星空间
“闪闪的星”的独立博客,英文名“Shansing!”。我认为每个人都是一颗闪星,我只是闪星之一。让我们闪闪发光吧,终有一天这里会是闪星空间!
原文地址:原创开源 VB 小程序: 质数判断(因数分解), 感谢原作者分享。

发表评论