一个分解质因数的Visual
Basic 程序
一
序 诗
七七老学生,还要啃数论。分解质因数,
短除不二门。
简单却烦琐,常常叹头痛。Visual
Basic,邦我解解闷。
二
序 言
1974年~1992年间,编过X2、TQ16
(图强16)、以及PC-1500、EC-1500小型机的算法语言程序。其中主要是编Basic程序。但1992年流行Windows后,原先的
Basic系统竟用不上了。真所谓到了英雄无用武之地的地步。Visual
Basic崛起后,有时也想学习一下,但已接近退休,且编程能力也不够,故使我却步,就惜别了编程。一别竟二十多年了。
编程好像下棋,有了兴趣,手会发痒。虽然用电子表格,可以作些简单而有规律的计算,例如我通过“戆算”,也发现过“勾股弦”数的三组新公式,但终究觉得不方便、不过瘾。所以常常想再进入Basic阵地,练练功。无奈一看到视窗上的工具箱、控件,还要设置一大堆属性,就烦躁,甚至害怕了。单纯的数值计算,与这些控件布设关连在一起,以我的肤浅,就再也无法编“非Visual”的Basic程序了。
还不甘心。反正空着无事,就想再试一试,看能不能学点什么。上星期,就从图书馆借了5本Visual
Basic的书,细心学了一下。不出两天,却惊喜地发现:原来可以跳过窗体、控件,直接在“代码窗口”,编写Visual
Basic应用程序,并可以用鼠标单击来启动程序。而Visual Basic
6.0的语言及编程规则,与以前的Basic基本相同,所以我原有的知识,也就没有过时,还用得着。于是兴奋的再复习一下程序设计。作为练习,随手编了一些小程序,一一通过试算,都自我满意了。此时,距借书时间仅5天而已。狂妄一点说,还真有一点廉颇饭量虽减,但脑筋未老的感觉。至于Visual
Basic的其他内容,则只能弃而不问,或大致看一下就算了。因为要全都学懂,真的很难,我也不想再为难自己了。
现在列一个《质因数分解的Visual Basic
程序》,虽曰班门弄斧,亦曰自娱自乐。若对小学算术老师有所启发,则更心有所得了。
三 原 理 说 明
求质因数,可用短除法,小学生都知道。
短除法就是将一个合数A,除以质数2、3、5、7、11、13、17、19、23、29、31、37、41、43、47、53、59、61、67、71、73、79、83、89、97、101、107、109
……,一个个试除呗。如700的质因数分解,短除法为:
2 ︱
700
2︱
350
5︱ 175
5︱ 35
7︱ 7
1
得700=2*2*5*5*7*1
但数大了,还真烦人。如果有调皮小学生故意考考你说:“19365037是有几个质因数相乘出来的?”你先可以简单判断出:
2、3、5、11不能整除19365037,不必除了。但7及13以后的质数,总要去硬除罢。而此时,又必须记住一个个质数,真是太烦心了,一个个除下去吧,直到71,19365037÷71﹦272747,哈哈整除了,才分出了一个质数71。但此时,又要找272747的质因数。谁有雅兴啊,不烦死人吗?发脾气说,找不到了,到272747为止就算了。其实,272747还可分解为311*877。可见大数分解,用手算确实为难人,更何况是对小学生呢。
这时计算机就大显神通。不过,还得要有个程序。于是我按短除法原理,编了一个Visual Basic
程序。程序中不是用已知质数2、3、5、7、11…一个个的去整除合数A,而是先用2去整除合数A。又因为2以后的质数都是奇数,所以再用3、5、7、9、11、13、15、17、19、21、23、25、27…一个个的去整除合数A。其中9、15、21、25、27等非质数,应该不必参加整除的。例如,A若有因数9,则早在除以3的时候就分解过了,此时不可能再有9的因数,这不是白算吗。但为了有规律,能作循环计算,也只能白算了。而所谓白算,也只是判断一下马上跳出,走过场而己。
编程试算后,觉得程序还算精练,不过打印格式太简单。但无关紧要,不去再折腾了。
四 《分解质因数的Visual Basic 程序》
程
序
解
释
Private Sub
Form_Click()
这是窗体Form子程序的头。其中Click,指鼠标单击
后,便可启动程序。
A = InputBox("输入合数 A
=")
窗体上显示输入框。用键盘输入合数A
K = (Int(Sqr(A) / 2) + 1) * 2 +
1 根据数论原理,只要判断到√A,就可判断出质数,
B = 2: I =
0
现将K 处理成比√A 略大的奇数,以便适应以后的循环。
C = A / B-Fix(A / B)
B=2,即从2开始整除。C是A除以2的余数,
Print
用以判断是否跳出Do循环
Print Spc(4); A; " = ";
Do While
C =
0
此段,每次判断余数C=0吗?C=0,就去作A / 2的
I = I + 1: A = A /
B
整除,再计算新的C,转回到Do。连续C=0,就连
C = A / B - Fix(A /
B)
续除以2,即得几个因数2,并以A/2为新的A。
If (I Mod 5) = 0 Then
Print
每行打印5个质因数相乘。
Print B;
"*";
Loop
若 C≠0就跳出,跳到Loop外。
For B = 3 To K Step
2
此段,判断A除以3,余数C=0吗?
C = A / B - Fix(A /
B)
连续C=0,就连续除以3,即得几个因数3,
Do While
C =
0
并以 A/3 得新的 A。
I = I + 1: A = A /
B
C≠0就跳出。跳到Loop外。再进入For B循环。
C = A / B - Fix(A /
B)
A除以3后,就除以5、7、9、11、13、15
If (I Mod 5) = 0 Then
Print
17、19、21、23、25、…都在判断成立后去整除,
Print B;
"*";
或跳出。得
0个或1、2、3、4 … 个质因数。
Loop
Next
B
Print
A;
Print
Print
Print
Spc(4);"质因数分解成功";
至此,计算结束。
End
Sub
这是窗体Form的子程序的尾。
五 操作及算例
1
输入程序方法:打开Visual Basic∕打开窗体form 1 ∕打开代码窗口form1
(Code)∕输入本程序。不生成执行文件.exe,直接在Visual Basic环境下运行,在窗体显示计算结果。
2 启动程序方法:点击菜单栏的运行∕启动 (弹出窗体)
∕在窗体空白处单击鼠标。
3 窗体显示“输入合数A=”、 显示“数据框“∕键盘输入数:700
(例一)∕点击“确定”
4
窗体显示“700=2*2*5*5*7*1“及“质因数分解成功“。计算完成。
5 若要继续算下一个数,便点击窗体空白处∕下一轮计算开始,重复3、4步骤。
6 退出方法:点击运行∕结束
算
例
700=2*2*5*5*7*1
19365037=71*311*877*1
272747=311*877
2=2*1
4096=2*2*2*2*2*2*2*2*2*2*2*2*1
311=311
36084049=6007*6007*1
2764411650=2*3*3*5*5*7*13*17*19*19*1
2764411651=271*10200781
10200781=10200781
1234567891011=3*7*13*67*107*630803*1
1234567891013=1234567891013
加载中,请稍候......