标题:各位老师好!求助编辑一个大整数的快速乘除法可调用程序
只看楼主
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 88楼 wmf2014
这回好!复制下来了,谢谢您!学习学习,非常感谢!
2020-02-22 09:20
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
试验了一下程序,用时16秒,快了不少,继续研究学习,谢谢老师!!
2020-02-22 09:38
wmf2014
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
等 级:贵宾
威 望:216
帖 子:2039
专家分:11273
注 册:2014-12-6
得分:0 
大数减法再优化了下,减少不必要的变量,十进制补数用计算的方式获取,优化后代码如下:
程序代码:
Public Function MPC(ByVal d1 As String, ByVal d2 As String) As String
  '大数减法d1-d2,如果d2>d1则交换,非法字符当字符0处理,不识别负数
  Dim a As String, i As Integer
  If mComp(d1, d2) < 0 Then                      '确保被减数大于减数
    MPC = MPC(d2, d1)                            '这里可根据需要添加负号输出负数
    Exit Function                                '其实负数还是要处理的,我经常取逆元取到负数,这时就需要加一次n-1
  End If
  a = ""
  For i = 1 To Len(d2)
    a = a & (9 - Val(Mid(d2, i, 1)))             '对减数按位取反
  Next
  For i = Len(d2) + 1 To Len(d1)
    a = "9" + a
  Next
  a = MPC1(d1, MPC1(a, "1"))                     '调整该减数为对应十进制补数并和被加数相加
  If Len(a) > Len(d1) Then a = Right(a, Len(d1)) '去掉进位
  For i = 1 To Len(a)
    If Mid(a, i, 1) <> "0" Then Exit For
  Next
  a = Right(a, Len(a) + 1 - i)                   '消前导0
  If a = "" Then a = "0"
  MPC = a
End Function

能编个毛线衣吗?
2020-02-22 09:52
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 93楼 wmf2014
非常好,谢谢!我试验一下!学习了,向你学习!
2020-02-22 10:54
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
含控制台输出1亿内用时2070秒转换约等34.5分钟


[此贴子已经被作者于2020-2-23 06:48编辑过]

2020-02-23 06:39
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
不含控制台输出用时1002转换约等16.7分钟。C++普通函数调用运算。

普通的判断,不含使用质数表。


[此贴子已经被作者于2020-2-23 08:27编辑过]

2020-02-23 06:39
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
您的程序比我的快,我的程序不是仅算素数的是1亿的拆分素数对,两个素数的和等于1亿,程序计算了大槪3小时以上(没有计算时间的程序,现在刚学会计算时间的程序),结果如下:(太长,仅发一部分)
100000000的方根为10000,方根内有119个总数有291400个:100000000=11+ 99999989
29+ 99999971
41+ 99999959
59+ 99999941
173+ 99999827
179+ 99999821
227+ 99999773
383+ 99999617
389+ 99999611
449+ 99999551
461+ 99999539
491+ 99999509
563+ 99999437
599+ 99999401
647+ 99999353
677+ 99999323
743+ 99999257
887+ 99999113
911+ 99999089
1091+ 99998909
1109+ 99998891
1181+ 99998819
1217+ 99998783
1487+ 99998513
1553+ 99998447
1559+ 99998441
1571+ 99998429
1583+ 99998417
1637+ 99998363
1709+ 99998291
1889+ 99998111
1901+ 99998099
1949+ 99998051
1979+ 99998021
2027+ 99997973
2087+ 99997913
2099+ 99997901
2020-02-23 09:17
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
那算前面小质数即可,后面大质数用减法即可得,不是更快了?
2020-02-23 09:27
ysr2857
Rank: 6Rank: 6
等 级:贵宾
威 望:28
帖 子:767
专家分:65
注 册:2020-2-10
得分:0 
回复 98楼 xianfajushi
就是这样算的,并不是减出来结果都是素数,还要判断,所以程序运行慢!谢谢关注!我不需要这么大的数据,我需要的是快速程序!一亿内的素数,数值不大数量多,经过比较前面的程序速度没有变化几乎一样,判定一个23位的素数单个素数,二者差1秒,明显的差距,再小的就没有差距了,用前面的程序算1亿内的数据差别很小,没有进步,不明显。
我算10090000000~10090001000之间有5对孪生素数,用我的程序运行时间179秒,用网友前面的改进程序运行时间是167秒,进步不明显,所以我还是要弄出快速乘法除法程序,有毫秒级的程序吗?算一步大整数的乘法除法在毫秒内的?
希望老师帮忙!其中一个用途就是前面的大整数的素性测试。
2020-02-23 10:09
xianfajushi
Rank: 7Rank: 7Rank: 7
等 级:黑侠
威 望:8
帖 子:527
专家分:690
注 册:2007-9-8
得分:0 
前面例举出孪生质数对,10090000000~10090001000之间有5对孪生素数是虾米?
孪生素数就是指相差2的素数对,例如3和5,5和7,11和13?如果是那只能找到2对27-29,17-19,有那5对?


[此贴子已经被作者于2020-2-23 11:54编辑过]

2020-02-23 10:53



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-499181-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.064561 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved