Разложение любого числа на 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
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д