С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/3: Рейтинг темы: голосов - 3, средняя оценка - 5.00
 Аватар для SMYH
2 / 2 / 1
Регистрация: 23.10.2013
Сообщений: 38

Булевые массивы "веса" от 1 - n

15.06.2014, 20:32. Показов 568. Ответов 2
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Задача в том, что нужно создать все булевые массивы одной длины, количество "1" в которых равно 1,2...n.
То есть для случая l = 4 и n = 1 ответ очевиден.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
bool** arr = new bool*[length];
    for(int i = 0; i<length; i++){
        arr[i] = new bool[length];
        for(int j = 0; j<length; j++){
            if(i==j){
                arr[i][j] = 1;
            }
            else{
                arr[i][j] = 0;
            }
        }
    }

arr - это:
Кликните здесь для просмотра всего текста

1000
0100
0010
0001

Для 1 все просто. Для n>1 намного сложнее. Может у кого-нибудь есть какие-то идеи. Я думал использовать циклический сдвиг, т.к. все "вектора" представляют собой сдвинутые другие. Под спойлером это ясно показано.
Кликните здесь для просмотра всего текста

Для веса 2.
>>
1100
0110
0011
1001
Другая "орбита"
1010
0101


P.S. В теории информации эта задача называется "Перебор всех векторов ошибок".
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
15.06.2014, 20:32
Ответы с готовыми решениями:

Задача на массивы и сортировку: Напечатать в порядке возрастания веса студентов подгруппы
Задание в C# Известен список фамилий и вес студентов вашей группы. Напечатать в порядке возрастания веса студентов Вашей подгруппы,вес...

Какое отклонение веса тела от среднего веса можно гарантировать?
При взвешивании тела получен средний вес m=2,3 г, среднее квадратическое отклонение веса σ=0,02 г. Какое отклонение веса тела от...

Напечатать в порядке возрастания веса студентов, вес которых не меньше среднего веса всей группы
Известен список фамилий и вес студентов группы(ввод с клавиатуры). Напечатать в порядке возрастания веса студентов, вес которых не меньше...

2
Эксперт С++
 Аватар для Mr.X
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
16.06.2014, 11:03
Рекурсивный вариант:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
/////////////////////////////////////////////////////////////////////////////////////////
//Задача в том, что нужно создать все булевые массивы одной длины, количество "1" 
//в которых равно 1,2...n.
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  print_binary_numbers_with_size_and_units_total
    (
        int                 size,
        int                 units_total,
        T_str   const   &   prefix,
        int             &   num_counter
    )
{
    if( size == 0 )
    {
        std::cout   <<  '#'
                    <<  ++num_counter
                    <<  '\t'
                    <<  prefix
                    <<  std::endl;
        return;
    }
 
    if( units_total     <   size )
    {
        print_binary_numbers_with_size_and_units_total
            (
                size - 1,
                units_total,
                prefix + '0',
                num_counter
            );
    }
 
    if( units_total > 0 )
    {
        print_binary_numbers_with_size_and_units_total
            (
                size - 1,
                units_total - 1,
                prefix + '1',
                num_counter
            );
    }//if
}
/////////////////////////////////////////////////////////////////////////////////////////
void  print_prompt_and_input_val_not_less_than
    (
        T_str   const   &   prompt,
        int             &   val,
        int                 left_bound
    )
{
    do
    {
        std::cout   <<  prompt;
        std::cin    >>  val;
    }
    while( val < left_bound );
}
/////////////////////////////////////////////////////////////////////////////////////////
int  main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        int     size    =   0;
 
        print_prompt_and_input_val_not_less_than
            (
                "Длина двоичного числа\t\t: ",
                size,
                1
            );
 
        int     units_total     =   0;
 
        print_prompt_and_input_val_not_less_than
            (
                "Количество единиц в числе\t: ",
                units_total,
                0
            );
 
        int     num_counter     =   0;
        print_binary_numbers_with_size_and_units_total
            (
                size,
                units_total,
                T_str(),
                num_counter
            );
        std::cout   <<  "\n\n\n\n\n\n";
    }//for
}
Добавлено через 5 минут
Нерекурсивный вариант:
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
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
/////////////////////////////////////////////////////////////////////////////////////////
//Задача в том, что нужно создать все булевые массивы одной длины, количество "1" 
//в которых равно 1,2...n.
/////////////////////////////////////////////////////////////////////////////////////////
#include <iostream>
#include <string>
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string     T_str;
/////////////////////////////////////////////////////////////////////////////////////////
void  print_binary_numbers_with_size_and_units_total
    (
        int     size,
        int     units_total
    )
{
    T_str   s       ( size - units_total,   '0' );
    s   +=  T_str   ( units_total,          '1' );
 
    int     num_counter     =   0;
 
    for(;;)
    {
        std::cout   <<  '#'
                    <<  ++num_counter
                    <<  "\t"
                    <<  s
                    <<  std::endl;
 
        T_str::size_type    pos     =   s.rfind( "01" );
 
        if( pos ==  T_str::npos )
        {
            break;
        }
 
        std::swap
            (
                s[ pos     ],
                s[ pos + 1 ]
            );
 
        //Если в конце нули, то реверсируем участок от pos + 2 до конце.
        for (
                int  L = pos + 2, R = size - 1;
 
                    L       <   R
                &&  s[L]    ==  '1'
                &&  s[R]    ==  '0';
 
                ++L, --R
            )
        {
            std::swap
                (
                    s[L],
                    s[R]
                );
        }//for
    }//for
}
/////////////////////////////////////////////////////////////////////////////////////////
void  print_prompt_and_input_val_not_less_than
    (
        T_str   const   &   prompt,
        int             &   val,
        int                 left_bound
    )
{
    do
    {
        std::cout   <<  prompt;
        std::cin    >>  val;
    }
    while( val < left_bound );
}
/////////////////////////////////////////////////////////////////////////////////////////
int  main()
{
    std::locale::global(std::locale(""));
    for(;;)
    {
        int     size    =   0;
 
        print_prompt_and_input_val_not_less_than
            (
                "Длина двоичного числа\t\t: ",
                size,
                1
            );
 
        int     units_total     =   0;
 
        print_prompt_and_input_val_not_less_than
            (
                "Количество единиц в числе\t: ",
                units_total,
                0
            );
 
        print_binary_numbers_with_size_and_units_total( size, units_total );
        std::cout   <<  "\n\n\n\n\n\n";
    }//for
}
1
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
16.06.2014, 11:30
если не поянтно будет объясню!

C++ (Qt)
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
#include <iostream>
 
using namespace std;
 
int main()
{
    int len, need;
    cin >> len >> need;
    for(int mask = 0; mask < (1 << len); mask++)
    {
        int cntbit = 0;
        for(int i = 0; i < len; i++)
            if(mask & (1 << i))
                cntbit++;
        if(cntbit == need)
        {
            for(int i = 0; i < len; i++)
                if(mask & (1 << i))
                    cout << 1;
                else
                    cout << 0;
            cout << endl;
        }
    }
    return 0;
}
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
16.06.2014, 11:30
Помогаю со студенческими работами здесь

Напечатать в порядке возрастания веса список студентов подгруппы, вес которых не меньше среднего веса всей группы
Дали задачу на C#: Известен список фамилий и вес студентов вашей группы.Напечатать в порядке возрастания веса список студентов Вашей...

имеется N предметов, веса которых a1,a2,a3,...,an. разделить эти предметы так,чтобы общие веса 3-х групп были одинаковы
нужна помощь.. имеется N предметов, веса которых a1,a2,a3,...,an. разделить эти предметы так,чтобы общие веса 3-х групп были одинаковы

Булевые функции
((x1((x2x4)+x3))x1x2)((x2x3)x4) 7. Выясните, полна ли система функций .

Булевые функции
Добрый день, итак, хочу найти к.н.ф. функции ( оно там должно быть ) Но я не вижу, даже если построить ТИ - то видно, что при всех...

булевые функции
Доказать (путем перебора возможных значений), что для любых величин A, B, C типа Boolean следующие пары логических выражений имеют...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru