找回密码
 加入我们

QQ登录

只需一步,快速开始

搜索
查看: 5636|回复: 1

[求助] 撸一发枚举勾股数组的问题

[复制链接]

78

主题

190

回帖

9

精华

贵宾会员

积分
15605
发表于 2015-8-9 23:59:34 | 显示全部楼层 |阅读模式
二十分钟前看到百度知道里有人问为什么勾与股的限制均为1-10000时,这个枚举软件能在10秒不到的时间算完。我就自己试了试。。。尼玛竟然18秒,如图所示:

18seconds

18seconds

检查了一下自己的算法貌似是没问题的,于是就在想是不是代码编译的问题,于是把高级优化的所有的勾打上了,然后,结果是17秒。。。

17seconds

17seconds

然后就想是不是电脑配置的问题,测试下来影响并不大。前面的两个测试结果均是在2.67GHz CPU+512MB RAM的虚拟机测试的,而这次我在Intel Xeon x5650+16GB RAM的物理机上测试了一遍,结果是15秒。。。

15seconds

15seconds

我擦。。。貌似配置的影响也不是很大啊。
谁来告诉我为什么!!!
贴代码了,先贴按钮的事件代码:
  1. Private Sub Command1_Click()
  2. Dim StGou As Long, SpGou As Long
  3. Dim StGu As Long, SpGu As Long
  4. Dim MyXian As Double
  5. Dim LvX As ListItem, LvC As Long
  6. Dim ETime As Long
  7. Dim FTime As SYSTEMTIME, CTime As SYSTEMTIME
  8. Call GetLocalTime(FTime)
  9. LvC = 0
  10. StGou = CLng(Text1.Text)
  11. StGu = CLng(Text2.Text)
  12. SpGou = CLng(Text3.Text)
  13. SpGu = CLng(Text4.Text)
  14. Dim i As Long, j As Long
  15. PB.Value = 0
  16. PB.Max = SpGou - StGou + 1
  17. Lv1.ListItems.Clear
  18. For i = StGou To SpGou Step 1
  19.     For j = i To SpGu Step 1
  20.         MyXian = Sqr(i ^ 2 + j ^ 2)
  21.         If (Int(MyXian) = MyXian) Then
  22.             LvC = LvC + 1
  23.             Set LvX = Lv1.ListItems.Add(LvC, , i)
  24.             LvX.ListSubItems.Add 1, , j
  25.             LvX.ListSubItems.Add 2, , MyXian
  26.         End If
  27.     Next j
  28.     PB.Value = PB.Value + 1
  29. Next i
  30. Call GetLocalTime(CTime)
  31. ETime = SubTime(FTime, CTime)
  32. SB.Panels.Item(1).Text = "勾股数组个数:" & LvC
  33. SB.Panels.Item(3).Text = "耗时:" & ETime & "秒"
  34. End Sub
复制代码

其中SB是StatusBar控件,PB是ProgressBar控件,Lv1是ListView控件
其中有个函数叫做SubTime,其代码实现是:
  1. Private Function SubTime(ByRef FirstTime As SYSTEMTIME, ByRef NextTime As SYSTEMTIME) As Long
  2. Dim ws As Integer
  3. Dim wmin As Integer
  4. Dim wh As Integer
  5. Dim wd As Integer
  6. ws = NextTime.wSecond - FirstTime.wSecond
  7. wmin = NextTime.wMinute - FirstTime.wMinute
  8. wh = NextTime.wHour - FirstTime.wHour
  9. wd = NextTime.wDay - FirstTime.wDay
  10. SubTime = ws + wmin * 60 + wh * 3600 + wd * 86400
  11. End Function
复制代码

貌似不够严谨,如果是在跨月份的半夜执行这个函数就会出问题。这个BUG大家可以自己去修复。
百度知道的链接是在http://zhidao.baidu.com/question/984385218752419859.html?entry=qb_ihome_tag

计算勾股数组.zip

9.27 KB, 下载次数: 3802

下载代码不回帖是一种很欠扁的行为

857

主题

2632

回帖

2

精华

管理员

此生无悔入华夏,  长居日耳曼尼亚。  

积分
36130
发表于 2015-8-10 09:59:32 | 显示全部楼层
好像很吊的样子。
您需要登录后才可以回帖 登录 | 加入我们

本版积分规则

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