ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[分享] 正整数分解的自定义函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2013-8-29 21:50 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:自定义函数开发
本帖最后由 香川群子 于 2013-8-29 22:00 编辑

要求是:
【任意一个正整数,分解为质数的幂乘积】

举例:
111=3*37
53136=2^4*3^4*41
65536=2^16
1234567=127*9721
987654321=3^2*17^2*379721
987654323=987654323 (质数无法分解)


首先是分解为质数的连乘积:

  1. Function f$(ByVal n&)
  2.     Dim b&
  3.     Do Until n < b ^ 2
  4.         b = b + IIf(b = 2, 1, 2)
  5.         Do
  6.             If n Mod b Then Exit Do Else n = n / b: f = f & "*" & b
  7.         Loop
  8.     Loop
  9.     If f = "" Then f = "=" & n Else f = "=" & Mid(f, 2) & IIf(n = 1, "", "*" & n)
  10. End Function
复制代码
下面是分解为质数的幂乘积的自定义函数:

  1. Function f$(ByVal n&)
  2.     Dim b&, p&
  3.     Do Until n < b ^ 2
  4.         b = b + IIf(b = 2, 1, 2)
  5.         Do
  6.             If n Mod b Then
  7.                 If p Then f = f & "*" & b & IIf(p = 1, "", "^" & p): p = 0
  8.                 Exit Do
  9.             Else
  10.                 n = n / b: p = p + 1
  11.             End If
  12.         Loop
  13.     Loop   
  14.     If f = "" Then f = "=" & n Else f = "=" & Mid(f, 2) & IIf(n = 1, "", "*" & n)
  15. End Function
复制代码

TA的精华主题

TA的得分主题

发表于 2013-8-30 10:32 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
我的第一反应是用字典,虽然笨,但易理解。

TA的精华主题

TA的得分主题

发表于 2013-8-30 10:57 | 显示全部楼层
香川同学是搞什么的?数学老师吗?

TA的精华主题

TA的得分主题

发表于 2013-9-4 23:23 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
楼主写一个IsPrime(nNum@)的函数吧~

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-5 10:15 | 显示全部楼层
本帖最后由 香川群子 于 2013-9-5 10:47 编辑
lee1892 发表于 2013-9-4 23:23
楼主写一个IsPrime(nNum@)的函数吧~


如果对一个正整数n,仅需要做是否素数/质数的判断,代码几是一样的。
但对于合数Do循环将更快终止,计算反而更快更简单:
  1. Function fs$(ByVal n&)
  2.     If n < 4 Then fs = "素数": Exit Function
  3.     If n Mod 2 Then fs = "素数" Else fs = "合数": Exit Function
  4.     b& = 1: m& = Int(n ^ 0.5)
  5.     Do
  6.         b = b + 2: If n Mod b = 0 Then fs = "合数": Exit Function
  7.     Loop While b < m
  8. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-5 10:26 | 显示全部楼层
本帖最后由 香川群子 于 2013-9-5 11:11 编辑

再增加一个函数,返回当前数的下一个素数。
  1. Function f&(ByVal n&) 'NextPrime
  2.     Dim b&, c&
  3.     If n Mod 2 = 0 Then f = n - 1 Else f = n
  4.     b = 1
  5.     Do
  6.         f = f + 2: n = f: c = Int(n ^ 0.5)
  7.         Do
  8.             b = b + 2: If n Mod b = 0 Then b = 1: Exit Do
  9.         Loop While b < c
  10.     Loop While b = 1
  11. End Function
复制代码

Number
素数判断
下個素数
素数分解
1
  素数
5
=1
2
  素数
5
=2
3
  素数
5
=3
4
合数
5
=2^2
5
  素数
7
=5
6
合数
7
=2*3
7
  素数
11
=7
8
合数
11
=2^3
9
合数
11
=3^2
10
合数
11
=2*5
11
  素数
13
=11
12
合数
13
=2^2*3
13
  素数
17
=13
14
合数
17
=2*7
15
合数
17
=3*5
16
合数
17
=2^4
17
  素数
19
=17
18
合数
19
=2*3^2
19
  素数
23
=19
20
合数
23
=2^2*5
21
合数
23
=3*7
22
合数
23
=2*11
23
  素数
29
=23
24
合数
29
=2^3*3
25
合数
29
=5^2
26
合数
29
=2*13
27
合数
29
=3^3
28
合数
29
=2^2*7
29
  素数
31
=29
30
合数
31
=2*3*5
31
  素数
37
=31

TA的精华主题

TA的得分主题

发表于 2013-9-5 11:33 | 显示全部楼层
裙子小姐啊,再多看看吧

质数判断有很成熟的快速测试,必学的~
费马素性测试 Fermet's Primality Test
米勒-拉宾素性测试 Miller-Rabin Primality Test

至于质因数分解,则通常的做法是先生成所需要的全部质数,再逐个测试。
至于生成全部质数,有个很朴素的方法叫筛选法。

嗯嗯,还是多看看多学学~

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-5 11:41 | 显示全部楼层
一共四个关于素数的自定义函数,整合到一起了:
  1. Function myPrime(ByVal Num, Optional k = 0) '素数字
  2.     'Max=2^31-1=2147483647
  3.       If k = 0 Then myPrime = IsPrime(Num) '質素数/合数判断
  4.     If k = -1 Then myPrime = PrimePower(Num)  '素因数の冪分解
  5.     If k = -2 Then myPrime = PrimeProduct(Num)  '素因数の乗数分解
  6.     If k = 1 Then myPrime = NxtPrime(Num)  '次の素数字
  7. End Function

  8. Function PrimePower$(ByVal n&) '質因数分解1 冪分解
  9.     Dim b&, p&
  10.     Do Until n < b ^ 2
  11.         b = b + IIf(b = 2, 1, 2)
  12.         Do
  13.             If n Mod b Then
  14.                 If p Then PrimePower = PrimePower & "*" & b & IIf(p = 1, "", "^" & p): p = 0
  15.                 Exit Do
  16.             Else
  17.                 n = n / b: p = p + 1
  18.             End If
  19.         Loop
  20.     Loop
  21.     If PrimePower = "" Then PrimePower = "=" & n Else PrimePower = "=" & Mid(PrimePower, 2) & IIf(n = 1, "", "*" & n)
  22. End Function

  23. Function PrimeProduct$(ByVal n&) '質因数分解2 乗数分解
  24.     Dim b&
  25.     Do Until n < b ^ 2
  26.         b = b + IIf(b = 2, 1, 2)
  27.         Do
  28.             If n Mod b Then Exit Do Else n = n / b: PrimeProduct = PrimeProduct & "*" & b
  29.         Loop
  30.     Loop
  31.     If PrimeProduct = "" Then PrimeProduct = "=" & n Else PrimeProduct = "=" & Mid(PrimeProduct, 2) & IIf(n = 1, "", "*" & n)
  32. End Function

  33. Function IsPrime$(ByVal n&) '質数判断
  34.    If n < 4 Then IsPrime = "素数": Exit Function
  35.     If n Mod 2 Then IsPrime = "素数" Else IsPrime = "合数": Exit Function
  36.     b& = 1: m& = Int(n ^ 0.5)
  37.     Do
  38.         b = b + 2: If n Mod b = 0 Then IsPrime = "合数": Exit Function
  39.     Loop While b < m
  40. End Function

  41. Function NxtPrime&(ByVal n&) '次の質数
  42.     Dim b&, c&
  43.     If n Mod 2 = 0 Then NxtPrime = n - 1 Else NxtPrime = n
  44.     b = 1
  45.     Do
  46.         NxtPrime = NxtPrime + 2: n = NxtPrime: c = Int(n ^ 0.5)
  47.         Do
  48.             b = b + 2: If n Mod b = 0 Then b = 1: Exit Do
  49.         Loop While b < c
  50.     Loop While b = 1
  51. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2013-9-5 11:50 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
lee1892 发表于 2013-9-5 11:33
裙子小姐啊,再多看看吧

质数判断有很成熟的快速测试,必学的~

本帖的VBA代码,不做数学研究。

并且由于 Mod函数 只允许使用Long 数值最大 2^31-1=2,147,483,647

……

所以你说的那些“高级”算法无需考虑。


TA的精华主题

TA的得分主题

发表于 2013-9-5 11:51 | 显示全部楼层
有办法证明以下结论吗?
(1)2和3是所有素数中唯一两个连着的数。
(2)2是唯一一个为偶数(双数)的质数。

点评

孪生素数对据说已证明有无数对……  发表于 2014-10-19 16:44
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-12-22 00:53 , Processed in 0.053100 second(s), 10 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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