枚举法-填数
2015-11-22 09:50
232 查看
在奥数中会有如下的题目:
算 法 描 述 题
X 算
题 题 题 题 题
解法:
假设每个数字都从0-9循环
直到计算出的结果与真实结果相等
pesudeocode:
算=i1:法=i2:描=i3:述=i4:题=i5
for i1=1 to 9
for i2=0 to 9
for i3=0 to 9
for i4=0 to 9
for i5=0 to 9
m1=i1*10^4+i2*10^3+i3*10^2+i4*10^1+i5
m2=i11
r1=i5*10^4+i5*10^3+i5*10^2+i5*10^1+i5
if m1=r1 then output resutl
当然也可以将题目变形一下:
填入适当的运算符,使等式成立
5 5 5 5 5 =5
两点需要注意
a.除号右侧的数字不能为0
b.乘除的运算级别高于加减
tip:
可以为变量left和right保存计算值
算 法 描 述 题
X 算
题 题 题 题 题
解法:
假设每个数字都从0-9循环
直到计算出的结果与真实结果相等
pesudeocode:
算=i1:法=i2:描=i3:述=i4:题=i5
for i1=1 to 9
for i2=0 to 9
for i3=0 to 9
for i4=0 to 9
for i5=0 to 9
m1=i1*10^4+i2*10^3+i3*10^2+i4*10^1+i5
m2=i11
r1=i5*10^4+i5*10^3+i5*10^2+i5*10^1+i5
if m1=r1 then output resutl
'//程序用以解决填数问题 '//只考虑正整数的情况 '//枚举法,效率比较低,总步数=9*10*10*10*9=81000 Sub NumberFill() Dim r1&, Out1(), n&, Step& Dim m1&, i1&, i2&, i3&, i4&, i5& ReDim Out1(1 To 100, 1 To 6) With Sheet4 For i1 = 1 To 9 '被乘数不可能是0,所以从1-9 For i2 = 0 To 9 For i3 = 0 To 9 For i4 = 0 To 9 For i5 = 1 To 9 '结果不为0,所以从1-9 m1 = i1 * 10 ^ 4 + i2 * 10 ^ 3 + i3 * 10 ^ 2 + i4 * 10 + i5 r1 = i5 * 10 ^ 5 + i5 * 10 ^ 4 + i5 * 10 ^ 3 + i5 * 10 ^ 2 + i5 * 10 + i5 Step = Step + 1 If m1 * i1 = r1 Then n = n + 1 Out1(n, 1) = i1: Out1(n, 2) = i2 Out1(n, 3) = i3: Out1(n, 4) = i4 Out1(n, 5) = i5: Out1(n, 6) = r1 End If Next i5 Next i4 Next i3 Next i2 Next i1 'Output .Cells(2, 9) = Step .Cells(2, 10).Resize(UBound(Out1), UBound(Out1, 2)) = Out1 End With End Sub
当然也可以将题目变形一下:
填入适当的运算符,使等式成立
5 5 5 5 5 =5
两点需要注意
a.除号右侧的数字不能为0
b.乘除的运算级别高于加减
tip:
可以为变量left和right保存计算值
'//程序用以解决填运算符 '//只考虑正整数的情况 Sub OperFill() Dim Out2(), cOut&, Chr$, nOut& '存储输出字段 Dim i(4), j&, op1&, op2&, op3&, op4& '数组arr存储运算符+-*/,变量 Dim Num(5), n& '存储需计算的5个数字 Dim leftNum!, rightNum! '存储中间结果 Dim sign&, oper(0 To 4) '存储累加运算符 Dim Result! '结果 With Sheet4 '读入运算符 oper(0) = "": oper(1) = "+": oper(2) = "-": oper(3) = "*": oper(4) = "/" '读入数字 For n = 1 To 5 Num(n) = .Cells(23, n) Next n Result = Right(.Cells(23, 6), 1) ReDim Out2(1 To 1000, 1 To 2) 'Main program For op1 = 1 To 4 i(1) = op1 For op2 = 1 To 4 i(2) = op2 For op3 = 1 To 4 i(3) = op3 For op4 = 1 To 4 i(4) = op4 '初始赋值 leftNum = 0 rightNum = Num(1) sign = 1 For j = 1 To 4 Select Case oper(i(j)) Case "+" '"+" leftNum = leftNum + sign * rightNum sign = 1 rightNum = Num(j + 1) Case "-" '"-" leftNum = leftNum + sign * rightNum sign = -1 rightNum = Num(j + 1) Case "*" '"*" rightNum = rightNum * Num(j + 1) Case "/" '"/" rightNum = rightNum / Num(j + 1) End Select Next j If leftNum + sign * rightNum = Result Then '存储结果 cOut = cOut + 1 For nOut = 1 To 4 Out2(cOut, 1) = cOut Out2(cOut, 2) = Out2(cOut, 2) & Num(nOut) & oper(i(nOut)) Next nOut Out2(cOut, 2) = Out2(cOut, 2) & Num(5) & "=" & Result End If Next op4 Next op3 Next op2 Next op1 'Output .Cells(30, 1).Resize(UBound(Out2), UBound(Out2, 2)) = Out2 End With End Sub
相关文章推荐
- 创建对象
- 黑马程序员-GUI图形用户界面
- POJ 2488 *** A Knight's Journey
- 一个小型电商企业的组织结构
- angularjs控制层
- C#常用操作类库五(电脑操作类)
- 【Java EE (Struts2 + Spring + Hibernate)开发】: Struts2(一)基本用法(待续)
- C#常用操作类库四(File操作类)
- QT上使用OpenCV
- C#常用操作类库一(验证类)
- Java 文件过滤 FileFilter
- Chrome有个HTTP请求报文生成插件叫postman,这插件在http服务接口调试时非常实用(Mac OS安装方法)
- C#常用操作类库三(XML操作类)
- 输入一个小于360的正整数,求它的正弦和余弦
- android中接口回调机制
- 国内无人机飞行控制器的研究
- POJ 3468 A Simple Problem with Integers
- ACM感悟
- 无线通信设计秘密三:效率 节能 组网
- 5.6.3.5 标准化深度值