ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[Excel 程序开发] [第77期]编写VBA代码解方程

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-7-30 03:04 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

回复 1楼 northwolves 的帖子

为了答题,恶补了初等数论相关的知识,楼主出的题可真不是一般的难。

做了一个自定义函数,=getxy(61)和=getxy(73)可解。

  1. Function getxy(d As Integer) As String
  2. Application.Volatile False
  3. Dim p(0 To 999) As Integer, q(0 To 999) As Integer, a(0 To 999) As Integer, i%, j%, k%, x As Double, y As Double, z As Double
  4. p(0) = 0
  5. q(0) = 1
  6. a(0) = Int(d ^ 0.5)
  7. If a(0) ^ 2 = d Then
  8.   getxy = "无解" 'd为完全平方数时无解
  9. Else
  10.   Do
  11.     i = i + 1
  12.     p(i) = a(i - 1) * q(i - 1) - p(i - 1)
  13.     q(i) = (d - p(i) ^ 2) / q(i - 1)
  14.     a(i) = Int((a(0) + p(i)) / q(i)) '计算√d的连分数
  15.   Loop While a(i) <> 2 * a(0)
  16.   
  17.   If i Mod 2 = 1 Then '如果循环节是奇数的话,扩充连分数数组到第二个循环节
  18.     For j = 1 To i
  19.       a(i + j) = a(j)
  20.     Next
  21.     i = i * 2
  22.   End If
  23.   
  24.   x = 1
  25.   y = a(i - 1)
  26.   For k = i - 2 To 1 Step -1 '根据连分数推算对应的渐近分数
  27.     z = x
  28.     x = y
  29.     y = a(k) * y + z
  30.   Next
  31.   x = a(0) * y + x
  32.   getxy = "(" & x & "," & y & ")"
  33. End If
  34. End Function
复制代码

[ 本帖最后由 sunya_0529 于 2011-7-30 03:06 编辑 ]

TA的精华主题

TA的得分主题

发表于 2011-8-11 22:26 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 wkbu 于 2011-8-15 11:46 编辑

Sub 题目1()
Dim x As Double
Dim y As Double
For y = 1 To 60000000
MySqr = Int(Sqr(73 * y * y))
For x = MySqr To MySqr + 1
If 73 * y * y = x * x - 1 Then
Cells(1, 9) = "题目一答案:"
Cells(1, 10) = "x=" & x
Cells(1, 11) = "y=" & y
Exit Sub
End If
Next
Next
End Sub

Sub 题目2()
Dim x As Double
Dim y As Double
For y = 1 To 600000000
MySqr = Int(Sqr(61 * y * y))
For x = MySqr To MySqr + 1
If 61 * y * y = x * x - 1 Then
Cells(2, 9) = "题目二答案:"
Cells(2, 10) = "x=" & x
Cells(2, 11) = "y=" & y
Exit Sub
End If
Next
Next
End Sub

TA的精华主题

TA的得分主题

发表于 2011-8-15 13:45 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
题目结束,请勿修改,以利版主总结、评分。

TA的精华主题

TA的得分主题

发表于 2011-8-31 21:38 | 显示全部楼层
我测试过了,可能无解
由于计算机的误差,要限定误差值为很小很小,这样速度很慢,穷举到很大数据都无解
有时,将误差设定较小,计算的结果根据最末位计算,是不对的,可惜今天没有将文件带来,改天贴上

TA的精华主题

TA的得分主题

发表于 2011-9-1 19:52 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
应该有解,不用解方程的算法,只用穷举法也可行。我自己在22楼的算法运算时间约20秒,期待狼版给出好的答案。

TA的精华主题

TA的得分主题

发表于 2011-9-3 15:29 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2011-9-8 08:46 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
学习了。

TA的精华主题

TA的得分主题

发表于 2011-9-18 21:58 | 显示全部楼层
wangg913 发表于 2011-8-15 13:45
题目结束,请勿修改,以利版主总结、评分。

有没有晚了?
  1. Sub Q1()
  2. Dim x As Double: Dim y1 As Double: Dim y2 As Double
  3. Dim i&

  4. i = 1
  5. Do
  6.     x = 73 * i
  7.     y1 = Sqr((x - 2) * x / 73)
  8.     y2 = Sqr(x * (x + 2) / 73)
  9.     If Int(y1) = y1 Or Int(y2) = y2 Then Exit Do
  10.     i = i + 1
  11. Loop
  12. If Int(y1) = y1 Then x = x - 1: y = y1 Else x = x + 1: y = y2
  13. Debug.Print x, y
  14. End Sub

  15. Sub Q2()
  16. Dim x As Double: Dim y1 As Double: Dim y2 As Double
  17. Dim i&

  18. i = 1
  19. Do
  20.     x = 61 * i
  21.     y1 = Sqr((x - 2) * x / 61)
  22.     y2 = Sqr(x * (x + 2) / 61)
  23.     If Int(y1) = y1 Or Int(y2) = y2 Then Exit Do
  24.     i = i + 1
  25. Loop
  26. If Int(y1) = y1 Then x = x - 1: y = y1 Else x = x + 1: y = y2
  27. Debug.Print x, y
  28. End Sub
复制代码
Q1:2281249       267000
Q2:851361202     109005632

点评

第2组答案错误: 相差-60不是相差1  发表于 2013-10-30 20:14

TA的精华主题

TA的得分主题

发表于 2013-7-26 16:21 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
今天查看了一下,居然此题不了了之,开创了先例!

点评

不好意思,我刚才自己看错题目用错参数所以验证错了。应该是好几个人都正解了。  发表于 2013-10-30 20:15
因为目前还没有人能解……  发表于 2013-10-30 19:52

TA的精华主题

TA的得分主题

发表于 2013-8-19 16:41 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
fangjianp 发表于 2013-7-26 16:21
今天查看了一下,居然此题不了了之,开创了先例!

要不版主你给总结下,结帖算了:)
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-11-21 18:34 , Processed in 0.043847 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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