您的位置:首页 > 其它

枚举法-填数

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

'//程序用以解决填数问题
'//只考虑正整数的情况
'//枚举法,效率比较低,总步数=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


 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: