| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
共有 172 人关注过本帖
标题:这个程序如何提高速度?算到10万内居然就需要几个小时呢
只看楼主 加入收藏
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:814
专家分:77
注 册:2020-2-10
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:6 
这个程序如何提高速度?算到10万内居然就需要几个小时呢
Private Sub Command1_Click()
'这个程序如何提高速度?算到10万内就需要几个小时呢
Dim a, b
a = Val(Text1)

Do While x <= a
x = x + 1
y = 0
Do While y <= a
y = y + 1
b = x ^ 2 - 2029 * y ^ 2
If b = -487 Then
s = s + 1

js = js & "x=" & x & "  y=" & y & vbCrLf
Else
js = js
End If

Loop
Loop

If s > 0 Then
Text2 = js
Else
Text2 = "  wu  jie"
End If


End Sub

Private Sub Command2_Click()
Text1 = ""
Text2 = ""

End Sub
昨天 13:27
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4951
专家分:30104
注 册:2008-10-15
收藏
得分:20 
1、明确指出变量数据类型,
Variant 数据类型是最慢,你可以把 a ,b ,s 定义为 long ,x,y ,定义为 Double ,因为计算过程中会超 long 范围。
long 数据类型对于VB6来说 是最快的,因为正好是计算机字长。

2、无效语句
js = js   这行命令干嘛?并且每个循环都要执行一遍

3、算法
核心计算是这句:b = x ^ 2 - 2029 * y ^ 2
这里的,B的值是随着 y 变大而逐步变小的,这里我们有一个结论,当
1、当 b = -487 成立时,不需要继续向后搜索了。
2、当 b < -487 成立时,也不需要继续向后搜索了。
所以这里加二个判断,跳过后续循环
If b = -487 Then
  s = s + 1
  js = js & "x=" & x & "  y=" & y & vbCrLf
  exit do
Elseif  b < -487 Then
  exit do
'else          '这二句都不要了
'js=js         '多余命令
End If

4、优化
每次内循环都要计算一遍 X ^ 2 ,这里浪费算力,可以在外循环里计算一次,然后保存到一个变量里,内循环直接使用。


'c 也要定义为 Double
Do While x <= a
x = x + 1
c = x ^ 2
y = 0
Do While y <= a
y = y + 1
b = c - 2029 * y ^ 2
......

----------------
测试时,VB6崩溃了,不愿再重做测试工程了。就这样吧。



[此贴子已经被作者于2025-3-11 19:27编辑过]


授人于鱼,不如授人于渔
早已停用QQ了
昨晚 19:26
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:814
专家分:77
注 册:2020-2-10
收藏
得分:0 
回复 2楼 风吹过b
谢谢!感谢指导,给你加分!

我试试,非常感谢!
昨晚 21:45
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:814
专家分:77
注 册:2020-2-10
收藏
得分:0 
Private Sub Command1_Click()
'这次速度快了不少以前10分钟的计算这次是1分钟了
Dim a, b, s As Long
Dim x, y As Double
a = Val(Text1)
x = 0
Do While x <= a
x = x + 1
y = 0
Do While y <= a
y = y + 1
b = x ^ 2 - 125 * y ^ 2
If b = -29 Then
  s = s + 1
  js = js & "x=" & x & "  y=" & y & vbCrLf
  Exit Do
ElseIf b < -29 Then
  Exit Do
'else          '这二句都不要了
'js=js         '多余命令
End If


Loop
Loop

If s > 0 Then
Text2 = js
Else
Text2 = "  wu  jie"
End If


End Sub

Private Sub Command2_Click()

Text1 = ""
Text2 = ""

End Sub
昨晚 23:52
ysr2857
Rank: 16Rank: 16Rank: 16Rank: 16
等 级:版主
威 望:34
帖 子:814
专家分:77
注 册:2020-2-10
收藏
得分:0 
Private Sub Command1_Click()
'这次也快以前10分钟的计算这次是1分钟了
Dim a, b, s As Long
Dim c
Dim x, y As Double
a = Val(Text1)
x = 0
Do While x <= a
x = x + 1
c = x ^ 2
y = 0
Do While y <= a
y = y + 1
b = c - 125 * y ^ 2
If b = -29 Then
  s = s + 1
  js = js & "x=" & x & "  y=" & y & vbCrLf
  Exit Do
ElseIf b < -29 Then
  Exit Do
'else          '这二句都不要了
'js=js         '多余命令
End If


Loop
Loop

If s > 0 Then
Text2 = js
Else
Text2 = "  wu  jie"
End If


End Sub

Private Sub Command2_Click()

Text1 = ""
Text2 = ""

End Sub
昨晚 23:59
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4951
专家分:30104
注 册:2008-10-15
收藏
得分:0 
Dim a, b, s As Long
Dim c
Dim x, y As Double

定义不能这样写,应该显示指出每个的数据类型

Dim a As Long, b As Long, s As Long
Dim c As Double
Dim x As Double, y As Double



授人于鱼,不如授人于渔
早已停用QQ了
9 小时前
风吹过b
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:贵宾
威 望:364
帖 子:4951
专家分:30104
注 册:2008-10-15
收藏
得分:0 
其实,这种程序的逻辑有问题。
已知公式,已知一个变量值,可以直接求解另一个变量值,来判断是否符合要求,
为什么还要大海捞针的用双循环去跑呢。

b = c - 125 * y ^ 2
If b = -29 Then
-----------------------
for x = 1 to a
y = sqr( x * x - 125 + 29 )
if int(y)=y then         '得到是一个整数
  if y<a then        '在输入范围内
    '得到一个解
  end if
end if
next x
这样不是更快一点吗
没有环境,未经测试


授人于鱼,不如授人于渔
早已停用QQ了
1 小时前
快速回复:这个程序如何提高速度?算到10万内居然就需要几个小时呢
数据加载中...
 
   



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

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.030140 second(s), 9 queries.
Copyright©2004-2025, BC-CN.NET, All Rights Reserved