Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
楼主: grf1973

[VBA] 用VBA解欧拉计划题目(1)

[复制链接]
发表于 2017-11-1 06:20 | 显示全部楼层
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
回复

使用道具 举报

发表于 2017-11-1 09:48 | 显示全部楼层
还是认为先解决数学问题,再用电脑来解决此数学问题:
    n = 10000
    i = n \ 3
    s = 3 * (1 + i) * i / 2    '3的倍数的和
    i = n \ 5
    s = s + 5 * (1 + i) * i / 2   '5的倍数的和
    i = n \ 15
    s = s - 15 * (1 + i) * i / 2   '3和5共同的倍数多算了
    其它的也有这个感觉:先数学,再编程
回复

使用道具 举报

发表于 2017-11-1 10:25 | 显示全部楼层
大灰狼1976 发表于 2017-10-31 16:48
我就想知道一下如果需要3个数的倍数(比如3、5、7)时,用下面那种方法应该如何操作。

超过2个倍数就没有意义了。

还不如筛选法把各个倍数过一次,最后遍历一遍统计求和。这样方便。
回复

使用道具 举报

发表于 2017-11-1 10:34 | 显示全部楼层
grf1973 发表于 2017-10-31 19:23
呃,还得减去多算的3*5*7的倍数。貌似多算了两次。。。。。

应该是,还需要再加上3*5*7的倍数。因为这些数,会在扣除3*5/3*7/5*7时被多扣一次。
回复

使用道具 举报

 楼主| 发表于 2017-11-1 10:37 | 显示全部楼层
对的。所以三个以上这样做就没意思了,要考虑的因素太多,还不如直接mod判断。
回复

使用道具 举报

发表于 2017-11-1 10:37 | 显示全部楼层
经验证,还是扣去倍数的算法-2更快。

  1. Sub SpeedCompare()
  2.     Dim i&, j&, k&, m&, n&, mySub$, tms#
  3.    
  4.     k = 1 * 10 ^ 3: Debug.Print vbCr; "Run Count: "; Format(k, "#,##0")
  5.     n = 50000
  6.    
  7.     For i = 1 To 3
  8.         mySub = "test" & i: tms = Timer
  9.         For j = 1 To k
  10.             Run mySub, n
  11.         Next
  12.         Debug.Print mySub; Format(Timer - tms, " 0.0000s")
  13.     Next
  14.     Debug.Print "--End--"
  15. End Sub
  16. Sub test1(n&)
  17.     Dim i&, s&
  18.     For i = 1 To n
  19.         If i Mod 3 = 0 Or i Mod 5 = 0 Or i Mod 7 = 0 Then s = s + i
  20.     Next
  21. End Sub
  22. Sub test2(n&)
  23.     Dim i&, s&, t&
  24.     For i = 3 To n Step 3
  25.         s = s + i
  26.     Next
  27.     For i = 5 To n Step 5
  28.         s = s + i
  29.     Next
  30.     For i = 7 To n Step 7
  31.         s = s + i
  32.     Next
  33.    
  34.     t = 3 * 5
  35.     For i = t To n Step t
  36.         s = s - i
  37.     Next
  38.     t = 3 * 7
  39.     For i = t To n Step t
  40.         s = s - i
  41.     Next
  42.     t = 5 * 7
  43.     For i = t To n Step t
  44.         s = s - i
  45.     Next
  46.    
  47.     t = 3 * 5 * 7
  48.     For i = t To n Step t
  49.         s = s + i
  50.     Next
  51.    
  52. End Sub
  53. Sub test3(n&)
  54.     Dim i&, s&
  55.     ReDim a(n) As Boolean
  56.     For i = 3 To n Step 3
  57.         a(i) = True
  58.     Next
  59.     For i = 5 To n Step 5
  60.         a(i) = True
  61.     Next
  62.     For i = 7 To n Step 7
  63.         a(i) = True
  64.     Next
  65.    
  66.     For i = 1 To n
  67.         If a(i) Then s = s + i
  68.     Next
  69.    
  70. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-11-1 10:40 | 显示全部楼层
呵呵,一个如此简单的题目被大神玩出花来了。对你孜孜追求极致的态度表示崇高的敬意!
回复

使用道具 举报

 楼主| 发表于 2017-11-1 10:45 | 显示全部楼层
Run mySub, n  不能调用啊
回复

使用道具 举报

 楼主| 发表于 2017-11-1 10:59 | 显示全部楼层
当n=10^7时,香川的结果如下:
Test1:         27142867857145              0.40625
Test2:         27142867857145              0.1875
Test3:         27142867857145              0.296875
显然第二种方法效率最高。
回复

使用道具 举报

发表于 2017-11-1 11:27 | 显示全部楼层
非得要带进沟里去
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-18 22:37 , Processed in 0.265808 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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