走阶梯算法设计(源码)

来源:互联网 发布:室内风景树淘宝 编辑:程序博客网 时间:2024/05/16 11:03

 要求: 某人上阶梯,阶梯共100道,可以一次跨1个阶梯,可以一次跨2个阶梯,可以一次跨3个阶梯,问上一次阶梯共有多少种走法?另请列出每种走法的步数排列(按先后顺序)!

'高精度正整数加减法,即大正整数加减法
'减法运算,已知第一数大于第二数
'主要用于本程序,为简化代码,不做转换和符号判断,如果想实现通用运算,请另外调整
Function dsys(n1, n2, f) As String
    Dim b1(), b2(), c, i, s
   
    '取大数长度分段分配数组大小
    c = IIf(Len(n1) > Len(n2), Int(Len(n1) / 12), Int(Len(n2) / 12)) + 1
    ReDim b1(c + 1), b2(c)
    s = 0
   
    'n1按12位分段取数存入数组
    For i = 1 To Len(n1) Step 12
        s = s + 1
        If Len(n1) > s * 12 Then
            b1(s) = Mid(n1, Len(n1) - s * 12 + 1, 12)
        Else
            b1(s) = Mid(n1, 1, Len(n1) - (s - 1) * 12)
        End If
    Next i
   
    'n2按12位分段取数存入数组
    s = 0
    For i = 1 To Len(n2) Step 12
        s = s + 1
        If Len(n2) > s * 12 Then
            b2(s) = Mid(n2, Len(n2) - s * 12 + 1, 12)
        Else
            b2(s) = Mid(n2, 1, Len(n2) - (s - 1) * 12)
        End If
    Next i
   
    '加法
    If f = 1 Then
        '按段相加,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) + Val(b2(i))
           
            '进位
            If Len(b1(i)) > 12 Then
                b1(i + 1) = Val(b1(i + 1)) + Val(Left(b1(i), Len(b1(i)) - 12))
                b1(i) = Right(b1(i), 12)
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    '减法
    Else
        '按段相減,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) - Val(b2(i))
           
            '借位
            If b1(i) < 0 Then
                b1(i + 1) = Val(b1(i + 1)) - 1
                b1(i) = Val(b1(i)) + 10 ^ 12
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    End If
    '去前0
    For i = 1 To Len(dsys)
        If Mid(dsys, i, 1) <> "0" Then
            dsys = Mid(dsys, i)
            Exit For
        End If
    Next i
End Function

'阶梯走法算法
Function dgzf(t As Integer, m As String) As String
Dim i As Integer
    '递归到1阶的走法
    If t = 1 Then
        dgzf = "1"
        Exit Function
    '递归到2阶的第2种走法
    ElseIf t = 2 And m = 2 Then
        dgzf = "2"
        Exit Function
    '递归到3阶的第4种走法
    ElseIf t = 3 And m = 4 Then
        dgzf = "3"
        Exit Function
    '假如走法数小等于上一阶走法总数
    ElseIf Not (dsbj(m, a(t - 1))) Then
        dgzf = "1" & dgzf(t - 1, m)
    '假如走法数小等于上两阶走法总数
    ElseIf dsbj(m, a(t - 1)) And Not (dsbj(m, dsys(a(t - 1), a(t - 2), 1))) Then
        dgzf = "2" & dgzf(t - 2, dsys(m, a(t - 1), 2))
    '假如走法数大于上两阶走法总数
    ElseIf dsbj(m, dsys(a(t - 1), a(t - 2), 1)) Then
        dgzf = "3" & dgzf(t - 3, dsys(dsys(m, a(t - 1), 2), a(t - 2), 2))
    End If
End Function

以下为程序源码,将以下内容复制粘贴到新建的文本文件中,保存后再将文件后缀名改名 .frm

VERSION 5.00
Begin VB.Form Form1
   Caption         =   "走阶梯算法设计"
   ClientHeight    =   4920
   ClientLeft      =   60
   ClientTop       =   345
   ClientWidth     =   6360
   LinkTopic       =   "Form1"
   ScaleHeight     =   4920
   ScaleWidth      =   6360
   StartUpPosition =   3  '窗口缺省
   Begin VB.Frame Frame2
      Caption         =   "求解:"
      ForeColor       =   &H000000FF&
      Height          =   3735
      Left            =   120
      TabIndex        =   2
      Top             =   1080
      Width           =   6135
      Begin VB.CommandButton Command2
         Caption         =   "结果清空"
         Height          =   375
         Left            =   4560
         TabIndex        =   11
         Top             =   240
         Width           =   1215
      End
      Begin VB.TextBox Text3
         Height          =   270
         Left            =   1080
         TabIndex        =   10
         Top             =   1155
         Width           =   4935
      End
      Begin VB.CommandButton Command1
         Caption         =   "求解走法"
         Default         =   -1  'True
         Height          =   375
         Left            =   3000
         TabIndex        =   9
         Top             =   240
         Width           =   1215
      End
      Begin VB.TextBox Text1
         Height          =   2055
         Left            =   120
         MultiLine       =   -1  'True
         ScrollBars      =   2  'Vertical
         TabIndex        =   8
         Top             =   1560
         Width           =   5895
      End
      Begin VB.ComboBox Combo1
         Height          =   300
         Left            =   1680
         Style           =   2  'Dropdown List
         TabIndex        =   6
         Top             =   270
         Width           =   975
      End
      Begin VB.TextBox Text2
         Height          =   270
         Left            =   1080
         Locked          =   -1  'True
         TabIndex        =   5
         Top             =   720
         Width           =   4935
      End
      Begin VB.Label Label4
         AutoSize        =   -1  'True
         Caption         =   "某种走法:"
         Height          =   180
         Left            =   120
         TabIndex        =   7
         Top             =   1200
         Width           =   900
      End
      Begin VB.Label Label3
         AutoSize        =   -1  'True
         Caption         =   "走法总数:"
         Height          =   180
         Left            =   120
         TabIndex        =   4
         Top             =   765
         Width           =   900
      End
      Begin VB.Label Label1
         AutoSize        =   -1  'True
         Caption         =   "阶梯数(1-200):"
         Height          =   180
         Left            =   120
         TabIndex        =   3
         Top             =   330
         Width           =   1350
      End
   End
   Begin VB.Frame Frame1
      BackColor       =   &H80000016&
      Caption         =   "要求:"
      ForeColor       =   &H000000FF&
      Height          =   975
      Left            =   120
      TabIndex        =   0
      Top             =   0
      Width           =   6135
      Begin VB.Label Label2
         BackColor       =   &H80000016&
         BackStyle       =   0  'Transparent
         Caption         =   $"Form1.frx":0000
         ForeColor       =   &H00FF0000&
         Height          =   615
         Left            =   240
         TabIndex        =   1
         Top             =   240
         Width           =   5775
      End
   End
End
Attribute VB_Name = "Form1"
Attribute VB_GlobalNameSpace = False
Attribute VB_Creatable = False
Attribute VB_PredeclaredId = True
Attribute VB_Exposed = False
Option Explicit
' 要求: 某人上阶梯,阶梯共100道,可以一次跨1个阶梯,可以一次跨2个阶梯,可以一次跨3个阶梯,问
'       上一次阶梯共有多少种走法?另请列出每种走法的步数排列(按先后顺序)!
Dim a() As String

Private Sub Command1_Click()
Dim str1 As String
    If dsbj(Text3.Text, a(Combo1.Text)) Or Text3.Text = "" Or Text3 Like "*[!0-9]*" Then
        MsgBox "输入数据过大或非数字", vbOKOnly + vbExclamation, "阶梯算法"
        Text3.SetFocus
        Exit Sub
    End If
    str1 = dgzf(Combo1.Text, Text3.Text)
    Text1 = vbNewLine & Combo1.Text & "级阶梯第【" & Text3 & "】种走法:" & vbNewLine & str1 & vbNewLine & Text1
End Sub

Private Sub Combo1_Click()
    Text2 = a(Combo1.Text)
    Text2.ToolTipText = Text2
End Sub

Private Sub Command2_Click()
    Text1 = ""
End Sub

Private Sub Text2_Change()
    If dsbj(Text3, Text2) Or Text3 = "" Then Text3 = Text2
End Sub

'输入数据合法性判断
Private Sub Text3_KeyPress(KeyAscii As Integer)
Dim str1 As String
   
    If KeyAscii = vbKeyRight Or KeyAscii = vbKeyLeft Or KeyAscii = vbKeyBack Then
    ElseIf KeyAscii < vbKey0 Or KeyAscii > vbKey9 Then
        KeyAscii = 0
    Else
        str1 = Text3
        str1 = Left(str1, Text3.SelStart) & Chr(KeyAscii) & Mid(str1, Text3.SelStart + Text3.SelLength + 1)
        If dsbj(str1, Text2) Or str1 Like "0*" Then KeyAscii = 0
    End If
End Sub

Private Sub Form_Load()
Dim i As Integer
    zfzs 200
    For i = 1 To 200
        Combo1.AddItem i
    Next i
    Combo1.Text = 100
   
End Sub

'阶梯走法算法
Function dgzf(t As Integer, m As String) As String
Dim i As Integer
    '递归到1阶的走法
    If t = 1 Then
        dgzf = "1"
        Exit Function
    '递归到2阶的第2种走法
    ElseIf t = 2 And m = 2 Then
        dgzf = "2"
        Exit Function
    '递归到3阶的第4种走法
    ElseIf t = 3 And m = 4 Then
        dgzf = "3"
        Exit Function
    '假如走法数小等于上一阶走法总数
    ElseIf Not (dsbj(m, a(t - 1))) Then
        dgzf = "1" & dgzf(t - 1, m)
    '假如走法数小等于上两阶走法总数
    ElseIf dsbj(m, a(t - 1)) And Not (dsbj(m, dsys(a(t - 1), a(t - 2), 1))) Then
        dgzf = "2" & dgzf(t - 2, dsys(m, a(t - 1), 2))
    '假如走法数大于上两阶走法总数
    ElseIf dsbj(m, dsys(a(t - 1), a(t - 2), 1)) Then
        dgzf = "3" & dgzf(t - 3, dsys(dsys(m, a(t - 1), 2), a(t - 2), 2))
    End If

End Function

'求某一阶数的走法总数,f(n)=f(n-1)+f(n-2)+f(n-3)
Function zfzs(n As Integer) As String
    ReDim a(n)
    Dim i As Integer
    If n > 0 Then a(1) = 1
    If n > 1 Then a(2) = 2
    If n > 2 Then a(3) = 4
   
    For i = 4 To n
        If Len(a(i - 1)) < 13 Then
            a(i) = Val(a(i - 1)) + Val(a(i - 2)) + Val(a(i - 3))
        Else
            a(i) = dsys(dsys(a(i - 1), a(i - 2), 1), a(i - 3), 1)
        End If
    Next i
    zfzs = a(n)
End Function

'高精度正整数加减法,即大正整数加减法
'减法运算,已知第一数大于第二数
'主要用于本程序,为简化代码,不做转换和符号判断,如果想实现通用运算,请另外调整
Function dsys(n1, n2, f) As String
    Dim b1(), b2(), c, i, s
   
    '取大数长度分段分配数组大小
    c = IIf(Len(n1) > Len(n2), Int(Len(n1) / 12), Int(Len(n2) / 12)) + 1
    ReDim b1(c + 1), b2(c)
    s = 0
   
    'n1按12位分段取数存入数组
    For i = 1 To Len(n1) Step 12
        s = s + 1
        If Len(n1) > s * 12 Then
            b1(s) = Mid(n1, Len(n1) - s * 12 + 1, 12)
        Else
            b1(s) = Mid(n1, 1, Len(n1) - (s - 1) * 12)
        End If
    Next i
   
    'n2按12位分段取数存入数组
    s = 0
    For i = 1 To Len(n2) Step 12
        s = s + 1
        If Len(n2) > s * 12 Then
            b2(s) = Mid(n2, Len(n2) - s * 12 + 1, 12)
        Else
            b2(s) = Mid(n2, 1, Len(n2) - (s - 1) * 12)
        End If
    Next i
   
    '加法
    If f = 1 Then
        '按段相加,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) + Val(b2(i))
           
            '进位
            If Len(b1(i)) > 12 Then
                b1(i + 1) = Val(b1(i + 1)) + Val(Left(b1(i), Len(b1(i)) - 12))
                b1(i) = Right(b1(i), 12)
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    '减法
    Else
        '按段相減,结果存入数组
        For i = 1 To c
            b1(i) = Val(b1(i)) - Val(b2(i))
           
            '借位
            If b1(i) < 0 Then
                b1(i + 1) = Val(b1(i + 1)) - 1
                b1(i) = Val(b1(i)) + 10 ^ 12
            End If
            '不足12位补0
            dsys = String(12 - Len(b1(i)), "0") & b1(i) & dsys
        Next i
    End If
    '去前0
    For i = 1 To Len(dsys)
        If Mid(dsys, i, 1) <> "0" Then
            dsys = Mid(dsys, i)
            Exit For
        End If
    Next i
End Function

'正整数字符串比较大小
Function dsbj(n1 As String, n2 As String) As Boolean
    dsbj = IIf(Len(n1) > Len(n2) Or Len(n1) = Len(n2) And n1 > n2, True, False)
End Function