加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

一个分解质因数的Visual Basic 程序

(2014-04-13 18:05:08)
标签:

教育

情感

一个分解质因数的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的子程序的尾。

 

五  操作及算例

    输入程序方法:打开Visual Basic∕打开窗体form 1 ∕打开代码窗口form1 (Code)∕输入本程序。不生成执行文件.exe,直接在Visual Basic环境下运行,在窗体显示计算结果。

   启动程序方法:点击菜单栏的运行∕启动 (弹出窗体) ∕在窗体空白处单击鼠标。

   窗体显示“输入合数A=”、 显示“数据框“∕键盘输入数:700 (例一)∕点击“确定”

   窗体显示“700=2*2*5*5*7*1“及“质因数分解成功“。计算完成。

   若要继续算下一个数,便点击窗体空白处∕下一轮计算开始,重复3、4步骤。

   退出方法:点击运行∕结束

 

    算     

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

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有