找回密码
 欢迎注册
查看: 19186|回复: 28

[擂台] 2至10个数,使用+,-,×,/,并运算=常数的程序

[复制链接]
发表于 2009-9-16 10:26:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?欢迎注册

×
  有已知的几个有次序数(2至10个,每个数字≥1,≤99)(比如 9 8 7 6 5 4 3 2 1 ),在数字间有空的地方填上适当的+,-,*,/,( ),使填后的算式=已知的常数(比如2009),不填处则认为进行“并”运算,即把两个数合起来(比如7 6=76),有这样简单程序能把所有情况都找出来吗? (给出的程序最好经过考证,能算出具体结果)
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-16 10:32:31 | 显示全部楼层
要求要什么程序语言啊
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-16 10:41:59 | 显示全部楼层
包不包括逗号运算符本身啊?(就是 C 语言规定的,值为最后那条语句)

这类算法我没做过,只是帮大家问一下,呵呵。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-9-16 12:18:48 | 显示全部楼层
包不包括逗号运算符本身啊?(就是 C 语言规定的,值为最后那条语句)

gxqcn 发表于 2009-9-16 10:41

不包括逗号运算符本身。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-9-16 12:25:58 | 显示全部楼层
本帖最后由 sheng_jianguo 于 2009-9-16 12:27 编辑
要求要什么程序语言啊
wayne 发表于 2009-9-16 10:32

什么程序语言都行,最好用常用的C 语言或FORTRAN语言。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-16 13:44:57 | 显示全部楼层
本帖最后由 wayne 于 2009-9-16 13:47 编辑

大致的想法就是往字符串987654321里插入运算符
然后将新字符串解释为一条命令。

这个用Bash和Tcl里的expr可以实现

也可以用Scilab里的evstr, Mathematica里的ToExpression
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-16 13:51:02 | 显示全部楼层
x**y是不是就表示$x^y$
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
 楼主| 发表于 2009-9-16 15:30:04 | 显示全部楼层
本帖最后由 sheng_jianguo 于 2009-9-16 15:33 编辑
x**y是不是就表示$x^y$
wayne 发表于 2009-9-16 13:51

不用考虑两个以上运算符组合运算(只需考虑+,-,*,/四种运算),当然能包括X**Y(即X^Y)最好了。
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-16 16:17:41 | 显示全部楼层
老以前写的VBA的例子,不加括号的,仅供参考:
  1. Sub calculate(ByVal target As Long, ParamArray s())
  2.     Dim t As String, v As String, sign, temp As String
  3.     Dim i As Long, j As Long, k As Long, n As Long, num As Long
  4.     t = Join(s, " ")
  5.     sign = Array("+", "-", "*", "/", " ")
  6.     num = 5 ^ UBound(s)
  7.     For i = 0 To num - 1
  8.         k = i
  9.         temp = s(0)
  10.         For j = 1 To UBound(s)
  11.             temp = temp & sign(k Mod 5) & s(j)
  12.             k = k \ 5
  13.         Next
  14.         temp = Replace(Trim(temp), " ", "")
  15.         If Abs(Evaluate(temp) - target) < 10 ^ -5 Then
  16.             n = n + 1
  17.             Debug.Print n & "."; vbTab; temp & "=" & target
  18.         End If
  19.     Next
  20.     MsgBox n & " records were found."
  21. End Sub

  22. Sub main()
  23.     calculate 2009, 9, 8, 7, 6, 5, 4, 3, 2, 1
  24. End Sub

复制代码
返回:

1.    9*8-7+6*54*3*2*1=2009
2.    9+8*7+6*54*3*2*1=2009
3.    9*8-7+6*54*3*2/1=2009
4.    9+8*7+6*54*3*2/1=2009
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
发表于 2009-9-16 18:40:06 | 显示全部楼层
http://bbs.emath.ac.cn/viewthrea ... ;fromuid=20#pid9081
中我的程序可以处理只有加减乘除的情况.
不过这里等于又添加了一层连接运算.使得情况更加复杂了.
毋因群疑而阻独见  毋任己意而废人言
毋私小惠而伤大体  毋借公论以快私情
您需要登录后才可以回帖 登录 | 欢迎注册

本版积分规则

小黑屋|手机版|数学研发网 ( 苏ICP备07505100号 )

GMT+8, 2024-4-27 09:31 , Processed in 0.057897 second(s), 16 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

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