Excel精英培训网

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

[已解决]石头和货物

[复制链接]
发表于 2013-2-28 20:04 | 显示全部楼层 |阅读模式
一个商人用一块40磅的石头和天平称货物。有一天他把石头摔成4块,每块质量都是整数。他很高兴,因为现在他从1磅到40磅中的每个整数磅的货物都能称出来了。请问4块石头各多重?


这是网上看到的题,能用程序或其它方法求出来么?谢谢
最佳答案
2013-2-28 21:39
爱疯 发表于 2013-2-28 21:14
因为不是实际问题,所以不急,
我还是先下去想想好了。。。。
  1. Sub test()
  2.     Dim ARR11(), arr12(1 To 4)
  3.     S = 40
  4.     ReDim ARR11(1 To S, 1 To 1)
  5.     '以下利用循环,判断不同数值的组合,算法有待优化
  6.     For I = 1 To S
  7.         For l1 = -1 To 1 Step 1
  8.             For l2 = -3 To 3 Step 3
  9.                 For l3 = -9 To 9 Step 9
  10.                     For l4 = -27 To 27 Step 27
  11.                         If l1 + l2 + l3 + l4 = I Then GoTo 100
  12.                     Next l4
  13.                 Next l3
  14.             Next l2
  15.         Next l1
  16. 100:
  17.         '数值排序
  18.         arr12(1) = l1
  19.         arr12(2) = l2
  20.         arr12(3) = l3
  21.         arr12(4) = l4
  22.         For P = 1 To 3
  23.             For Q = P + 1 To 4
  24.                 If Abs(arr12(P)) < Abs(arr12(Q)) Then
  25.                     T = arr12(P)
  26.                     arr12(P) = arr12(Q)
  27.                     arr12(Q) = T
  28.                 End If
  29.             Next Q
  30.         Next P
  31.         '组合算式
  32.         SS = ""
  33.         For P = 1 To 4
  34.             If arr12(P) <> 0 Then SS = SS & Format(arr12(P), "+0;-0")
  35.         Next P
  36.         SS = I & "=" & Right(SS, Len(SS) - 1)
  37.         ARR11(I, 1) = SS
  38.     Next I
  39.     '返回结果
  40.     Range("A1").Resize(S, 1) = ARR11
  41. End Sub
复制代码
296024-VBA-3的N次幂组合不同的数值.rar (8.31 KB, 下载次数: 11)
发表于 2013-2-28 20:33 | 显示全部楼层
1-N的数都能通过3^A±3^B±3^C……表达。
40 = 1+3+9+27
任何一个数都可以用3的几次幂加减之后得到
譬如
1=3的0次幂
2=3^1-3^0
3=3^1
4=3^1+3^0  (3+1)
5=3^2-3^1-3^0(9-3-1)
40 = 1+3+9+27 =3^0+3^1+3^2+3^3

所以最轻的是1,最重的27

评分

参与人数 1 +10 金币 +10 收起 理由
爱疯 + 10 + 10 这也是刚想到,不好意思,是我的问题

查看全部评分

回复

使用道具 举报

 楼主| 发表于 2013-2-28 20:51 | 显示全部楼层
那么的帅 发表于 2013-2-28 20:33
1-N的数都能通过3^A±3^B±3^C……表达。
40 = 1+3+9+27
任何一个数都可以用3的几次幂加减之后得到

谢谢帅哥的说明,学习了!
很想知道,如何用代码返回如下效果:


1=1
2=3-1
3=3
4=3+1
5=9-3-1
.
.
.
40 = 27+9+3+1


即列举1到40的(由这几个数构成的)表达式。
如写成40=1+3+9+27也可
回复

使用道具 举报

发表于 2013-2-28 20:51 | 显示全部楼层
爱疯 发表于 2013-2-28 20:51
谢谢帅哥的说明,学习了!
很想知道,如何用代码返回如下效果:

最简单的方法,用循环 并 进行判断。
回复

使用道具 举报

 楼主| 发表于 2013-2-28 20:57 | 显示全部楼层
那么的帅 发表于 2013-2-28 20:51
最简单的方法,用循环 并 进行判断。

啊?听你说了,我还没是不知道
回复

使用道具 举报

 楼主| 发表于 2013-2-28 21:14 | 显示全部楼层
因为不是实际问题,所以不急,
我还是先下去想想好了。。。。
回复

使用道具 举报

发表于 2013-2-28 21:39 | 显示全部楼层    本楼为最佳答案   
爱疯 发表于 2013-2-28 21:14
因为不是实际问题,所以不急,
我还是先下去想想好了。。。。
  1. Sub test()
  2.     Dim ARR11(), arr12(1 To 4)
  3.     S = 40
  4.     ReDim ARR11(1 To S, 1 To 1)
  5.     '以下利用循环,判断不同数值的组合,算法有待优化
  6.     For I = 1 To S
  7.         For l1 = -1 To 1 Step 1
  8.             For l2 = -3 To 3 Step 3
  9.                 For l3 = -9 To 9 Step 9
  10.                     For l4 = -27 To 27 Step 27
  11.                         If l1 + l2 + l3 + l4 = I Then GoTo 100
  12.                     Next l4
  13.                 Next l3
  14.             Next l2
  15.         Next l1
  16. 100:
  17.         '数值排序
  18.         arr12(1) = l1
  19.         arr12(2) = l2
  20.         arr12(3) = l3
  21.         arr12(4) = l4
  22.         For P = 1 To 3
  23.             For Q = P + 1 To 4
  24.                 If Abs(arr12(P)) < Abs(arr12(Q)) Then
  25.                     T = arr12(P)
  26.                     arr12(P) = arr12(Q)
  27.                     arr12(Q) = T
  28.                 End If
  29.             Next Q
  30.         Next P
  31.         '组合算式
  32.         SS = ""
  33.         For P = 1 To 4
  34.             If arr12(P) <> 0 Then SS = SS & Format(arr12(P), "+0;-0")
  35.         Next P
  36.         SS = I & "=" & Right(SS, Len(SS) - 1)
  37.         ARR11(I, 1) = SS
  38.     Next I
  39.     '返回结果
  40.     Range("A1").Resize(S, 1) = ARR11
  41. End Sub
复制代码
296024-VBA-3的N次幂组合不同的数值.rar (8.31 KB, 下载次数: 11)
回复

使用道具 举报

发表于 2013-3-1 09:00 | 显示全部楼层
随机也OK的吧。
  1. Sub t31()
  2.     Dim ar$(1 To 40, 1 To 1), ak(3)
  3.     Dim i&, j&, s$, a, b, c
  4.     a = Array(1, 3, 9, 27)
  5.     b = Array("+", "-")
  6.     c = Array(-1, 0, 1)
  7.     For i = 1 To 40
  8.         Do
  9.             s = ""
  10.             For j = 0 To 3
  11.                 s = s & b(Int(Rnd() * 2)) & (a(j) * c(Int(Rnd() * 3)))
  12.             Next j
  13.         Loop Until Evaluate(Mid(s, 2)) = i
  14.         ar(i, 1) = Replace(Replace(Replace(Mid(s, 2), _
  15.             "--", "+"), "-+", "-"), "+-", "-") & "=" & i
  16.     Next i
  17.     [a1].Resize(40) = ar
  18. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2013-3-1 10:04 | 显示全部楼层
谢谢帅哥和花!

{:25:}
回复

使用道具 举报

发表于 2013-3-1 10:51 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-30 02:51 , Processed in 0.914488 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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