Разложение любого числа на N слагаемых - VB

Узнай цену своей работы

Формулировка задачи:

Как найти все возможные варианты разложения какого либо числа на N слагаемых. Я думаю что лучший вариант это делать через рекурсию, но я не понимаю как это описать. Пример: Дано число 7 разложить на сумму 4-х слагаемых. 7=7+0+0+0 7=0+7+0+0 7=4+1+1+1 7=1+1+4+1 и т.д. P.S. Как вы могли заметить в данных строках слагаемые переставлены местами и это не ошибка

Решение задачи: «Разложение любого числа на N слагаемых»

textual
Листинг программы
'::: Разбить n всеми способами на k слагаемых
 
Function Combine(n As Integer, k As Integer) As Variant()
Dim R() As Integer
Dim V() As Variant
Dim W() As Variant
    If k = n Then
       ReDim R(1 To k) As Integer
       For i& = 1 To k
           R(i&) = 1
       Next i&
       ReDim V(1 To 1) As Variant
       V(1) = R
       Combine = V
       Exit Function
    Else
       V = Combine(n - 1, k)
       m& = UBound(V, 1)
       ReDim W(1 To m& * k) As Variant
       j& = 1
       For i& = 1 To m&
           For l& = 1 To k
               W(j&) = V(i&)
               W(j&)(l&) = W(j&)(l&) + 1
               j& = j& + 1
           Next l&
       Next i&
       Combine = W
    End If
End Function
 
'::: Запуск
 
Sub Test()
Dim Z() As Variant
Dim Res() As String
 
    n% = CInt(InputBox("Что разбиваем?"))
    k% = CInt(InputBox("Сколько слагаемых?"))
 
    Z = Combine(n%, k%)
     
    '::: Удаление откровенных повторов:
 
    ReDim Res(1 To 100) As String
     
    p& = 1
    sz& = 100
    
    For i& = 1 To UBound(Z, 1)
    
        Tmp$ = ""
        u& = UBound(Z(i&), 1)
        
        For j& = 1 To u&
            Tmp$ = Tmp$ & CStr(Z(i&)(j&)) & IIf(j& = u&, "", "+")
        Next j&
        
        q% = 0
        
        For ii& = 1 To p& - 1
            If Tmp$ = Res(ii&) Then
               q% = -1
               Exit For
            End If
        Next ii&
               
        If q% = 0 Then
        
           Res(p&) = Tmp$
           p& = p& + 1
        
           If p& > sz& Then
              sz& = sz& + 100
              ReDim Preserve Res(1 To sz&) As String
           End If
           
        End If
        
    Next i&
 
    ReDim Preserve Res(1 To p& - 1) As String
 
    For i& = 1 To p& - 1
        Debug.Print Res(i&)
    Next i&
    
End Sub

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4 из 5
Похожие ответы