枚举法-填数

在奥数中会有如下的题目:     

算 法 描 述 题
               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


 

Python网络爬虫与推荐算法新闻推荐平台:网络爬虫:通过Python实现新浪新闻的爬取,可爬取新闻页面上的标题、文本、图片、视频链接(保留排版) 推荐算法:权重衰减+标签推荐+区域推荐+热点推荐.zip项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助。 【资源内容】:包含完整源码+工程文件+说明(如有)等。答辩评审平均分达到96分,放心下载使用!可轻松复现,设计报告也可借鉴此项目,该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的。 【提供帮助】:有任何使用问题欢迎随时与我联系,我会及时解答解惑,提供帮助 【附带帮助】:若还需要相关开发工具、学习资料等,我会提供帮助,提供资料,鼓励学习进步 【项目价值】:可用在相关项目设计中,皆可应用在项目、毕业设计、课程设计、期末/期中/大作业、工程实训、大创等学科竞赛比赛、初期项目立项、学习/练手等方面,可借鉴此优质项目实现复刻,设计报告也可借鉴此项目,也可基于此项目来扩展开发出更多功能 下载后请首先打开README文件(如有),项目工程可直接复现复刻,如果基础还行,也可在此程序基础上进行修改,以实现其它功能。供开源学习/技术交流/学习参考,勿用于商业用途。质量优质,放心下载使用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值