ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 14517|回复: 46

无聊之中,做了一个质数判断,尚待完善

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-1-18 18:44 | 显示全部楼层 |阅读模式
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖已被收录到知识树中,索引项:其他结构和算法
本帖最后由 aoe1981 于 2014-1-19 17:48 编辑

  尚待完善以下两个方面:
  Excel2003 VBA中,当数值超过15位数是便自动舍入计成科学计数法,由于与原数已经发生了变化,故而最大能判断是否素数的范围是最大的15位数,这是需完善的第一个方面。  如果一个数是合数,给出的分解式中,其实还不能称做因数分解,必须使每个因数都是质数时才达到目标,而此时一个数能分解成多少个质因数的乘积,其个数是未定的,因此,如何能用代码完成因数分解,倒是一个难题,是为需完善之第二个方面!
  求助高手,传附件如下。

   质数判断.rar (12.95 KB, 下载次数: 44)


  请注意,目前自17楼起比较成熟,请注意总结的三种序列!一切皆源起于一篇文章中读到的话:19个1组成的19位数是一个质数,11是个质数,此间,3到18位1组成的数都是合数,由此想验证,并且,想知道20个1及以上可能的情况下,又是什么结论。才纠结于此地,欲罢不能,痛苦不堪!!!

点评

知识树索引内容:27、29楼  发表于 2014-1-19 22:37

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 18:48 | 显示全部楼层
Private Sub CommandButton1_Click()
Dim x&, i&, n#, j#, pd As Boolean
If TextBox1.Text = "" Then MsgBox "请输入要判断的自然数!", , "友情提示": Label3.Caption = "": Exit Sub
If IsNumeric(TextBox1.Text) = False Then MsgBox "请输入数字,中间不能有空格!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text <> Int(TextBox1.Text) Then MsgBox "请输入整数!", , "友情提示":  TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text < 2 Then MsgBox "请输入大于1的自然数!", , "友情提示":  TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text > 999999999999999# Then MsgBox "数据过大,本程序最大可判断的15位数!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
n = TextBox1.Text
If n = 2 Then Label3.Caption = "质数": Exit Sub
If n ^ 0.5 = Int(n ^ 0.5) Then x = n ^ 0.5 Else x = Int(n ^ 0.5 + 1)
pd = False
For i = 2 To x
If i <> 2 And i Mod 2 = 0 Then GoTo 100
If i <> 3 And i Mod 3 = 0 Then GoTo 100
If i <> 5 And i Mod 5 = 0 Then GoTo 100
If i <> 7 And i Mod 7 = 0 Then GoTo 100
j = n / i
If j = Int(j) Then Label3.Caption = "合数 " & i & "×" & j: pd = True: Exit For
100:
Next
If pd = False Then Label3.Caption = "质数"
End Sub

TA的精华主题

TA的得分主题

发表于 2014-1-18 19:35 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
aoe1981 发表于 2014-1-18 18:48
Private Sub CommandButton1_Click()
Dim x&, i&, n#, j#, pd As Boolean
If TextBox1.Text = "" Then Ms ...

知识树    一个可以对数字进行素数判断,以及自动因数分解的自编函数

TA的精华主题

TA的得分主题

发表于 2014-1-18 20:01 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 20:14 | 显示全部楼层
yjh_27 发表于 2014-1-18 19:35
知识树    一个可以对数字进行素数判断,以及自动因数分解的自编函数

多谢,一会研究下,因式分解的问题,我用自己的思路解决了。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 20:16 | 显示全部楼层
liucqa 发表于 2014-1-18 20:01
聪明人都是直接用查表法

查什么表?质数表吗?如果是这样,首先,质数表永远只是一部分,其推导规则至今是悬而未决的数学难题。。。即使如此,一个合数要因数分解,还是要逐一测试各个质数的,遇到太大的数时,往往束手无策。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 20:18 | 显示全部楼层
以下改进后的代码解决了因数分解的问题,但仍然只能最大判断15位数,我的目标是更大的数,有人说19个连续的1组成的19位数是一个质数,而在此之下的3到18位连续的1组成的数都是合数,对此,只能验证一大半,遗憾。。。
Private Sub CommandButton1_Click()
Dim x&, i&, n#, j#, pd As Boolean, pdjg$
If TextBox1.Text = "" Then MsgBox "请输入要判断的自然数!", , "友情提示": Label3.Caption = "": Exit Sub
If IsNumeric(TextBox1.Text) = False Then MsgBox "请输入数字,中间不能有空格!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text <> Int(TextBox1.Text) Then MsgBox "请输入整数!", , "友情提示":  TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text < 2 Then MsgBox "请输入大于1的自然数!", , "友情提示":  TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text > 999999999999999# Then MsgBox "数据过大,本程序最大可判断的15位数!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
n = TextBox1.Text
If n = 2 Then Label3.Caption = "质数": Exit Sub
pd = False
300:
If n ^ 0.5 = Int(n ^ 0.5) Then x = n ^ 0.5 Else x = Int(n ^ 0.5 + 1)
For i = 2 To x
    If i <> 2 And i Mod 2 = 0 Then GoTo 100
    If i <> 3 And i Mod 3 = 0 Then GoTo 100
    If i <> 5 And i Mod 5 = 0 Then GoTo 100
    If i <> 7 And i Mod 7 = 0 Then GoTo 100
    j = n / i
    If j = Int(j) Then pdjg = pdjg & i & "×": pd = True: GoTo 200
100:
Next
GoTo 400
200:
n = j: If n = 2 Then GoTo 400 Else GoTo 300
400:
Label3.Caption = "合数 " & pdjg & n
If pd = False Then Label3.Caption = "质数"
End Sub

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 20:21 | 显示全部楼层
改进后的附件如下:
且因数分解后式子最长的数是2的36次方,即:68719476736,且没有超过15位数,窗体中标签控件的大小即根据此设计!

质数判断.rar

13.01 KB, 下载次数: 23

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 21:27 | 显示全部楼层
本帖最后由 aoe1981 于 2014-1-18 22:22 编辑
yjh_27 发表于 2014-1-18 19:35
知识树    一个可以对数字进行素数判断,以及自动因数分解的自编函数

此帖中的数学思路是:所有素数中只有2是偶数,其余都是奇数,于是彼楼主的循环是按2,3,5,7,9,11,13,15,17,19,21.。。。。进行的,我则是划掉了2,3,5,7除了自身的所有倍数,目的也是为了减少循环次数。。。。彼楼主在因数分解后的表达式上考虑比我周全,学习了。。。。另外,其实首先对一个数进行开方,则一下子大量减少了循环的次数。。。

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-1-18 22:36 | 显示全部楼层
本段代码是简化后的,基本作用如上,因数表达式优化代码一会再上,先作为中间成果记录下来(此段比上段可读性强一些):
Private Sub CommandButton1_Click()
Dim x&, i&, n#, j#, pdjg$ '判断结果
If TextBox1.Text = "" Then MsgBox "请输入要判断的自然数!", , "友情提示": Label3.Caption = "": Exit Sub
If IsNumeric(TextBox1.Text) = False Then MsgBox "请输入数字,中间不能有空格!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text <> Int(TextBox1.Text) Then MsgBox "请输入整数!", , "友情提示":  TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text < 2 Then MsgBox "请输入大于1的自然数!", , "友情提示":  TextBox1.Text = "": Label3.Caption = "": Exit Sub
If TextBox1.Text > 999999999999999# Then MsgBox "数据过大,本程序最大可判断的15位数!", , "友情提示": TextBox1.Text = "": Label3.Caption = "": Exit Sub
n = TextBox1.Text
Do
    If n = 2 Then Exit Do
    If n ^ 0.5 = Int(n ^ 0.5) Then x = n ^ 0.5 Else x = Int(n ^ 0.5 + 1)
    For i = 2 To x
        If i <> 2 And i Mod 2 = 0 Then GoTo 100
        If i <> 3 And i Mod 3 = 0 Then GoTo 100
        If i <> 5 And i Mod 5 = 0 Then GoTo 100
        If i <> 7 And i Mod 7 = 0 Then GoTo 100
        j = n / i
        If j = Int(j) Then pdjg = pdjg & i & "×": GoTo 200
100:
    Next
    Exit Do
200:
    n = j
Loop
If pdjg = "" Then Label3.Caption = "质数" Else Label3.Caption = "合数 " & pdjg & n
End Sub
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-4 01:25 , Processed in 0.045657 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表