Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.62/13: Рейтинг темы: голосов - 13, средняя оценка - 4.62
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787

Разложить число на слагаемые

02.12.2015, 13:18. Показов 2530. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго всем времени суток! Подскажите пожалуйста что я не правильно делаю.
Нужно разложить целое число на слагаемые распечатать не повторяющиеся.
Пример 4 разложится на 2
1 + 3
2 + 2
3 + 1 не печатать
на 3 слагаемых
1 + 1 + 2
2 + 1 + 1 не печатать
Вот мой код.Разлаживает,но только 1 раз не пойму в чем дело.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
Option Explicit
'на форме 2 ListBox List1 и List2 используются в качестве массивов
Dim seq As ListBox 'исходная последовательность
Dim sum As ListBox 'массив суммы
Dim X1 As Integer 'число для разложения
Dim C1 As Integer 'число слагаемых
 
Sub Pop(A As ListBox) ' процедура удаления 1элемента с конца массива
Dim N As Integer
N = A.ListCount
N = N - 1
If A.ListCount > 0 Then A.RemoveItem N Else Exit Sub
End Sub
 
Sub PrintSub(A As ListBox) ' процедура печати массива
Dim i As Integer
For i = 0 To A.ListCount - 1
    Print A.List(i) & "  ";
Next
Print
End Sub
Sub InitMas(A As ListBox) ' процедура инициаизации массива(для теста)
Dim i As Integer
Do While i < 6
    i = i + 1
    A.AddItem i
Loop
End Sub
Sub MySelect(X As Integer, C As Integer, Optional i As Integer = 0) 'рекурсивная процедура поиска слагаемых
 
If C < 0 Or X < 0 Then
    Exit Sub
ElseIf X <> 0 And C = 0 Then
    Exit Sub
ElseIf X = 0 And C <> 0 Then
    Exit Sub
ElseIf X = 0 And C = 0 Then
    PrintSub sum
Else
    For i = i To seq.ListCount
        sum.AddItem seq.List(i)
        MySelect X - Val(seq.List(i)), C - 1, i
        Pop sum
    Next
End If
End Sub
 
Private Sub Form_Click() ' тест
X1 = 4 'число для разложения меняется
C1 = 2 'число слагаемых меняется
    InitMas seq
    MySelect X1, C1
End Sub
 
Private Sub Form_Load()
Set seq = List1
Set sum = List2
End Sub
На форме 2 ListBox работает по клику на форме
Выдает 1 + 3 и все.
Пожалуйста помогите.
Спасибо.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
02.12.2015, 13:18
Ответы с готовыми решениями:

Разложить число на слагаемые
n натуральное число. Разложить число на слагаемые : 1) на два 2) на три. Помогите написать,с комментариями,программу. Паскаль

разложить число на разрядные слагаемые
Подскажите, как можно через каждые 3 нуля добавить пробел? На рзряды разложить получилось, а вот пробел между каждыми 3 нулями вообще...

Разложить число на конкретные слагаемые в php
Добрый день! Имеется следующая задача: есть рандомное число в интервале . Его необходимо разбить на известные слагаемые, а именно...

9
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
03.12.2015, 01:34  [ТС]
Подправил код.
Visual Basic
1
2
3
4
5
6
7
    For i = i To seq.ListCount - 1
        sum.AddItem seq.List(i)
        'PrintSub sum
        MySelect X - Val(seq.List(i)), C - 1, i + 1
        Pop sum
        'PrintSub sum
    Next
Но где теряется элемент не могу понять.На C++ работает правильно.На скрине видно как заполняется массив sum.Видно,что второй суммы не будет.
Миниатюры
Разложить число на слагаемые  
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
03.12.2015, 10:30  [ТС]
Всем спасибо.Задача решена.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
03.12.2015, 14:24
Я подумал. А как бы я стал решать такую задачу?
1. Чтобы ограничить повторение, вероятно следует,
чтобы все слагаемые располагались лишь по возрастанию.
2. Для двух слагаемых это условие достаточно
3. А если слагаемых больше?
4. То тут возможен рекурсивный подход. Задаем одно
наибольшее слагаемое и вызываем эту же процедуру
разбить на части оставшееся число. ...
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
03.12.2015, 17:18  [ТС]
Переписал процедуру MySelect так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub MySelect(ByVal X As Integer, C As Integer, Optional i As Integer = 0) 'рекурсивная процедура поиска слагаемых
 
If C < 0 Or X < 0 Then
    Exit Sub
ElseIf X <> 0 And C = 0 Then
    Exit Sub
ElseIf X = 0 And C <> 0 Then
    Exit Sub
ElseIf X = 0 And C = 0 Then
    PrintSub sum
Else
    For i = i To seq.ListCount - 1
        sum.AddItem seq.List(i)
        If i = 0 Then MySelect X - Val(seq.List(i)), C - 1 Else MySelect X - Val(seq.List(i)), C - 1, i
        sum.RemoveItem sum.ListCount - 1
             
    Next
End If
End Sub
раложение правильно в первой половине т.е когда i = 0 или i = 1.Если пишу

Visual Basic
1
 If i = 0 Then MySelect X - Val(seq.List(i)), C - 1 Else MySelect X - Val(seq.List(i)), C - 1, i + 1
массив sum заполняется правильно,но при следующем проходе элементы "смещаются" на 1 позицию.Такое впечатление,что при такой записи
Visual Basic
1
For i = i To seq.ListCount - 1
цикл не работает.Рано обрадовался и полностью не протестировал.Вопрос остался открытым.В c++ работает правильно и без ошибок так что сам алгоритм верный что то у меня с реализацией в цикле.

Добавлено через 9 минут
Если пишу так
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub MySelect(ByVal X As Integer, C As Integer, Optional i As Integer = 0) 'рекурсивная процедура поиска слагаемых
 
If C < 0 Or X < 0 Then
    Exit Sub
ElseIf X <> 0 And C = 0 Then
    Exit Sub
ElseIf X = 0 And C <> 0 Then
    Exit Sub
ElseIf X = 0 And C = 0 Then
    PrintSub sum
Else
    For i = i To seq.ListCount - 1
        sum.AddItem seq.List(i)
       MySelect X - Val(seq.List(i)), C - 1
        sum.RemoveItem sum.ListCount - 1
             
    Next
End If
End Sub
Разложение верно,но печатаются все все комбинации.
0
Регистрация: 23.10.2013
Сообщений: 5,076
Записей в блоге: 8
03.12.2015, 17:44
Genn55,
А если проводить сортировку? (по возрастанию)
Как обнаружено меньшее слагаемое после большего,
то вся комбинация отпадает ...
0
es geht mir gut
 Аватар для SoftIce
11274 / 4760 / 1183
Регистрация: 27.07.2011
Сообщений: 11,439
03.12.2015, 17:46
Цитата Сообщение от Genn55 Посмотреть сообщение
В c++ работает правильно
Показали бы ради интереса.
0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
03.12.2015, 20:21  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;
 
vector< int > seq; // исходная последовательность
vector< int > sub; // вектор слагаемых
 
void show_sub()
{
    copy( sub.begin(), sub.end(), ostream_iterator< int >( cout, " " ) );
    cout << endl;
}
 
void fun( int x, int c, size_t i = 0 )
{
    if ( c < 0 || x < 0 )  return;
    else if ( x == 0 && c != 0 ) return;
    else if ( x != 0 && c == 0 ) return;
    else if ( x == 0 && c == 0 ) show_sub();
    else
 
        for (i = i ; i < seq.size(); i++ )
        {
            sub.push_back( seq[ i ] );
           // show_sub();
            fun( x - seq[ i ], c - 1, i );
            sub.pop_back();
            //show_sub();
        }
}
 
int main()
{
    system("chcp 1251 > nul");
    int x, c;
 
    cout << "Введите число: ";
    cin >> x;
    cout << "Введите количество чисел для подбора: ";
    cin >> c;
        for (int i = 1 ; i <= 6; ++i )
        {
            seq.push_back( i );
 
        }
    fun( x, c );
 
    return 0;
}
Добавлено через 2 часа 16 минут
SoftIce мне то зачем + ?.Я надеюсь,что мне помогут разобраться!
А код работает правильно при условии,что последовательность сортирована и нет одинаковых элементов.
В визульном я дуб-дерево.Пытаюсь освоиться,но не всегда получается как я хочу.
1
03.12.2015, 20:42

Не по теме:

Цитата Сообщение от Genn55 Посмотреть сообщение
SoftIce мне то зачем +
Затем, что этот оригинальный код, тем более корректно работающий, может быть кому-то (например мне) интересен.

0
413 / 250 / 118
Регистрация: 26.12.2012
Сообщений: 787
03.12.2015, 22:23  [ТС]
Не могу понять почему рекурсия не продолжается если так
Visual Basic
1
MySelect X - Val(seq.List(i)), C - 1, i
если так
Visual Basic
1
MySelect X - Val(seq.List(i)), C - 1
прокручивается все
если так
Visual Basic
1
MySelect X - Val(seq.List(i)), C - 1, i + 1
все срабатывает,но и массив заполнятся i + 1 и элементы смещаются.А цикл в любом случае работает.Не пойму в чем дело.

Добавлено через 1 час 17 минут
Ну какой же я баран!!Передавать же нужно по значению,а не по ссылке!
Visual Basic
1
Sub MySelect(ByVal X As Integer, ByVal C As Integer, Optional ByVal i As Integer = 0)
Пожалуйста,кому интересно,потестируйте может снова вылезет ошибка.Я пока не заметил.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.12.2015, 22:23
Помогаю со студенческими работами здесь

Сколькими способами можно разложить число на слагаемые
Лесенка Лесенкой называется набор кубиков, в котором каждый более верхний слой содержит кубиков меньше, чем предыдущий. Требуется...

Разложить заданное число на всевозможные слагаемые использованием рекурсии
Помогите, пожалуйста. С начала семестра не могу решить задачу: разложить заданное число на всевозможные слагаемые использованием рекурсии. ...

Разложить заданное число на слагаемые, которые не будут повторяться
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;string.h&gt; #include &lt;conio.h&gt; int main() { int f=0; do{ int one =...

Как разложить число на максимально большие слагаемые, если количество слагаемых не превышает 4-х?
Как разложить число на максимально большие слагаемые если количество слагаемых не превышает 4-х. Например: Число 25 Кол.Слаг. 4 ...

Число и его слагаемые
Построить таблицу всех различных разбиений заданного натурального числа N на сумму трех натуральных слагаемых (разрядов разбиения)...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
Архитектура слоя интернета для сервера-слоя.
Hrethgir 11.04.2026
В продолжение https:/ / www. cyberforum. ru/ blogs/ 223907/ 10860. html Знаешь что я подумал? Раз мы все источники пишем в голове ветки, то ничего не мешает добавить в голову такой источник, который сам. . .
Подстановка значения реквизита справочника в табличную часть документа
Maks 10.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "ПланированиеПерсонала", разработанного в конфигурации КА2. Задача: при выборе сотрудника (справочник Сотрудники) в ТЧ документа. . .
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru