Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3013|回复: 17

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

[复制链接]
发表于 2017-11-1 16:48 | 显示全部楼层 |阅读模式
下班前再发两题。

第9题:
三角形三边和为1000,求三边积

答案是:31875000
发表于 2017-11-1 16:54 | 显示全部楼层
此题有疑问。

如果是正三角形,则每边长=1000/3
三边乘积=37037037

是否还有其它限制条件?
回复

使用道具 举报

 楼主| 发表于 2017-11-1 16:57 | 显示全部楼层
不好意思,是直角三角形。
原题是这样的:
特殊毕达哥拉斯三元组
毕达哥拉斯三元组是三个自然数a < b < c组成的集合,并满足

a2 + b2 = c2
例如,32 + 42 = 9 + 16 = 25 = 52。

有且只有一个毕达哥拉斯三元组满足 a + b + c = 1000。求这个三元组的乘积abc。

回复

使用道具 举报

发表于 2017-11-1 20:48 | 显示全部楼层
本帖最后由 香川群子 于 2017-11-1 20:52 编辑

明白了:
1. 自然数a<b<c
2. a,b,c构成直角三角形,即满足 a^2+b^2=c^2
3. a+b+c=1000

求a、b、c数值,并计算a*b*c

……
分析,c取值范围 415-500(等腰直角三角形a=b 直到 近似a=0,b=c)
于是有 a*b=500000-1000c
模拟取值即可。

回复

使用道具 举报

发表于 2017-11-1 20:58 | 显示全部楼层
果然是唯一的解:
  a     b     c    a^2+b^2    c^2   a+b+c  a*b*c
200  375  425  180625  180625  1000  31875000

回复

使用道具 举报

发表于 2017-11-1 21:15 | 显示全部楼层
本帖最后由 香川群子 于 2017-11-1 21:21 编辑

已经写了注释了,看不懂就是笨蛋。

  1. Sub test() 'by kagawa
  2.     s = 1000 '直角三角形的周长s
  3.     c1 = s / (1 + 1 + Sqr(2)) * Sqr(2) '计算直角边最小值(等腰直角三角形)
  4.    
  5.     For c = -Int(-c1) To s / 2 - 1 '遍历c取值范围
  6.         ab = s * (s / 2 - c) '简化计算满足a+b+c=s条件的直角三角形关系得到a*b范围
  7.         'a+b+c=s → a+b=s-c
  8.         'a^2+2ab+b^2=s^2-2sc+c^2
  9.         '2ab=s^2-2sc → ab=s(s/2-c)
  10.         
  11.         For a = ab \ c To Sqr(ab) '遍历a最小值(b取近似=c的最大值时) 直到 a=b时a最大值
  12.             b = ab / a '计算c、a确定后此时的b值
  13.             If b = Int(b) Then 'b为整数时,得到一组自然数a<b<c 且a+b+c=s
  14.                 If a + b + c = s Then '满足周长条件时
  15. '                If a * a + b * b = c * c Then '或满足直角三角形平方和关系时 (两个条件必然同时满足)
  16.                     Debug.Print a; b; c; a * a + b * b; c * c; a + b + c; a * b * c
  17.                 End If
  18.             End If
  19.         Next
  20.     Next
  21. End Sub
复制代码


评分

参与人数 1 +12 收起 理由
苏子龙 + 12 我和小伙伴都惊呆了

查看全部评分

回复

使用道具 举报

发表于 2017-11-1 22:03 | 显示全部楼层
笨蛋前来仰望两位真神

评分

参与人数 1 +12 收起 理由
苏子龙 + 12 堵路妈,让我们一起仰望大神

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2017-11-2 08:27 | 显示全部楼层
贴下我的代码。设a<=b<c,因为a+b+c=1000,所以a<333,b<500。
  1. Sub problem9()  '直角三边和为1000,求三边积(结果是200*375*425=31875000)
  2.     For a = 3 To 333
  3.         For b = a To 500
  4.             c = 1000 - a - b
  5.             If a * a + b * b = c * c Then Debug.Print a, b, c, a * b * c: Exit Sub
  6.         Next
  7.     Next
  8. End Sub
复制代码

评分

参与人数 1 +12 收起 理由
苏子龙 + 12 神马都是浮云

查看全部评分

回复

使用道具 举报

发表于 2017-11-2 12:01 | 显示全部楼层
常规想法:
  1. Sub tt()
  2. MaxA = Int(1000 / (2 + Sqr(2)))
  3. MinB = MaxA + 1
  4. MaxB = 1000 / 2 - 1
  5. For a = 1 To MaxA
  6.     For b = MinB To MaxB
  7.         c = Sqr(a * a + b * b)
  8.             If a + b + c = 1000 Then Debug.Print a, b, c, a * a + b * b, c * c, a * b * c
  9. Next b, a
  10. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2017-11-2 13:50 | 显示全部楼层

为什么  MinB = MaxA + 1?
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-8 03:17 , Processed in 0.378060 second(s), 6 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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