Форум программистов, компьютерный форум, киберфорум
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16
#1

Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом - C++

01.10.2016, 14:28. Просмотров 1887. Ответов 13
Метки нет (Все метки)

Имеются цифры 1, 2, 3, 4, 5, 6, 7, 8, 9.
Необходимо расставить между ними любое количество знаков "плюс" или "минус" так, чтобы получить выражение, равное числу введенного пользователем.

Например: Ввожу число 100. Результат: 123+4-5+67-89=100. Число 123 вышло из склеивания соседних цифр 1, 2 и 3. Также 67 и 89.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.10.2016, 14:28
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом (C++):

Между заданными числами расставить знаки сложения и вычитания так, чтобы в итоге получилось указанное число - C++
Простая задачка из школьной олимпиады (задача на асмп №366). У меня превышает лимит времени. Если есть другие пути поделитесь пж ...

Расставить знаки между цифрами так, чтобы получилось заданное число - C++
Помогите разобраться с алгоритмом. Вот задача: Имеются цифры 1, 2, 3, 4, 5, 6, 7, 8, 9. Необходимо расставить между ними любое...

Нужно расставить между числами знаки + или - таким образом, чтобы получилось выражение, значение которого равно s и вывести его на экран - C++
Доброго времени суток Задание: дано n чисел и число s. Нужно расставить между числами знаки + или - таким образом, чтобы получилось...

Можно ли добавить в последовательность из различных скобок цифры и знаки, чтобы получилось правильное арифметическое выражение? - C++
Здравствуйте. Прошу помощи в решение задачи. Дана конечная последовательность, состоящая из левых и правых скобок pазличных заданных...

В выражении расставить знаки арифметических операций, чтобы получилось заданное число - C++
В арифметическом выражении 1*2*3*4*5 вместо звездочек расставить арифметические операции + , - , * , / так, чтобы получилось число...

Расставить между числами знаки "+" и "-" так, чтобы значение выражение стало равно S - C++
Даны N целых чисел X1, X2, ..., XN. Расставить между ними знаки "+" и "-" так, чтобы значение получившегося выражения было равно заданному...

13
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
01.10.2016, 14:59 #2
Например: Ввожу число 100. Результат: 123+4-5+67-89=100. Число 123 вышло из склеивания соседних цифр 1, 2 и 3. Также 67 и 89.
Дело в том, что предложенная вами задача - комбинаторная: т.е. число 100 может быть получено суммой множества других вариантов слагаемых а не только: 123+4-5+67-89=100. Вопрос: скажите вам нужно найти все варианты, я так понимаю ??
1
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16
01.10.2016, 15:35  [ТС] #3
Invader0x7F, мне нужно любой вариант используя эти цифры и склеивания)
0
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
01.10.2016, 15:55 #4
Сделаю и выложу.
1
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16
01.10.2016, 15:56  [ТС] #5
Спасибоооо)))
0
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
01.10.2016, 18:16 #6
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
//Имеются цифры 1, 2, 3, 4, 5, 6, 7, 8, 9.
//Необходимо расставить между ними любое количество знаков
//"плюс" или "минус" так, чтобы получить выражение, равное
//числу введенного пользователем.
 
//Например: Ввожу число 100. Результат: 123+4-5+67-89=100.
//Число 123 вышло из склеивания соседних цифр 1, 2 и 3. Также 67 и 89.
///////////////////////////////////////////////////////////////////////////////
#include <cmath>
#include <iostream>
#include <string>
#include <vector>
///////////////////////////////////////////////////////////////////////////////
typedef std::string                 T_expr;
typedef std::vector     < int   >   T_ternary_number;
///////////////////////////////////////////////////////////////////////////////
T_expr  make_expr
    (
        T_ternary_number    const   &   ternary_number,
        T_expr              const   &   digits
    )
{
    T_expr  res;
 
    for( size_t  i{}; i < digits.size(); ++i )
    {
        if(i)
        {
            switch  (
                        ternary_number[ i - 1 ]
                    )
            {
            case    1   :   res     +=  '+';    break;
            case    2   :   res     +=  '-';    break;
            default     :
                ;
            }//switch
        }//if
 
        res     +=  digits[i];
    }//for
 
    return  res;
}
///////////////////////////////////////////////////////////////////////////////
int     calc_expr( T_expr   expr )
{
    size_t  pos{};
    int     res     =   std::stoi   (
                                        expr,
                                        &pos
                                    );
 
    expr    =   expr.substr( pos );
 
    while   (
                !expr.empty()
            )
    {
        char    op  =   expr.front();
        expr.erase(0, 1);
        int     term    =   std::stoi   (
                                            expr,
                                            &pos
                                        );
 
        expr    =   expr.substr( pos );
        op  ==  '+'
            ?   res     +=  term
            :   res     -=  term;
    }//while
 
    return  res;
}
///////////////////////////////////////////////////////////////////////////////
bool    successfully_inc_ternary_number( T_ternary_number     &   ternary_number )
{
    for (
            int
            i   =    ternary_number.size()  -   1;
            i   >=  0;
            --i
        )
    {
        if  (
                ternary_number[i]   <   3
            )
        {
            ++ternary_number[i];
            return  true;
        }
        else
        {
            ternary_number[i]   =   0;
        }
    }//for
 
    return  false;
}
///////////////////////////////////////////////////////////////////////////////
bool    successfully_set_expr
    (
        int         n,
        T_expr  &   expr
    )
{
    static  const       T_expr  DIGITS  { "123456789"   };
 
    T_ternary_number    ternary_number  (
                                            DIGITS.size() - 1
                                        );
 
    do
    {
        expr    =   make_expr   (
                                    ternary_number,
                                    DIGITS
                                );
 
        if  (
                    calc_expr( expr )
                ==  n
            )
        {
            return  true;
        }
    }
    while   (
                successfully_inc_ternary_number( ternary_number )
            );
 
    return  false;
}
///////////////////////////////////////////////////////////////////////////////
int     main()
{
    for(;;)
    {
        int     n{};
        std::cout   <<  "n = ";
        std::cin    >>  n;
 
        T_expr  expr;
 
        std::cout   <<  (
                            successfully_set_expr( n,   expr )
                                ?   expr
                                :   "no solution"
                        )
 
                    <<  std::endl
                    <<  std::endl;
    }//for
}
1
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16
01.10.2016, 23:33  [ТС] #7
Большое спасибо! Но в какой среде ты разрабатывал? У меня ошибки:
0
Миниатюры
Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом  
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
01.10.2016, 23:49 #8
Цитата Сообщение от MDefs Посмотреть сообщение
У меня ошибки
С++11 надо подключить.
1
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16
02.10.2016, 00:00  [ТС] #9
Всем Всем СПАСИБО!!!) Вопрос. Что посоветуете начинающему. Как выучить это программирования?
0
GbaLog-
Любитель чаепитий
3031 / 1399 / 338
Регистрация: 24.08.2014
Сообщений: 4,968
Записей в блоге: 1
Завершенные тесты: 2
02.10.2016, 00:02 #10
Цитата Сообщение от MDefs Посмотреть сообщение
Как выучить это программирования?
Читайте книжки.
Литература C++
1
Mr.X
Эксперт С++
3051 / 1696 / 265
Регистрация: 03.05.2010
Сообщений: 3,867
02.10.2016, 00:04 #11
Цитата Сообщение от MDefs Посмотреть сообщение
Что посоветуете начинающему. Как выучить это программирования?
Читать толковые книжки и программировать непрерывно!

Добавлено через 1 минуту
Цитата Сообщение от GbaLog- Посмотреть сообщение
Читайте книжки.
*************
1
GbaLog-
Любитель чаепитий
3031 / 1399 / 338
Регистрация: 24.08.2014
Сообщений: 4,968
Записей в блоге: 1
Завершенные тесты: 2
02.10.2016, 00:06 #12
Лучший ответ Сообщение было отмечено автором темы, экспертом или модератором как ответ
Дайте совет, куда двигаться дальше
Цитата Сообщение от Mr.X Посмотреть сообщение
1) STL (Джосаттис)
2) Дискретная математика (Новиков)
3) Алгоритмы (Седжвик, Кормен)
4) ООП (осваивать на практике, почитывая Страуструпа, Липпмана и Прату)
5) Паттерны проектирования (Банда четырех)
6) Шаблоны (Вандевурд, Александреску)
7) Параллельное программирование (Уильямс)
8) Книги по оформлению кода (Чистый код, Совершенный код, Ален Голуб)
9) Графика - Qt
10) Как только все это изучите - приступайте к Бусту
11) Скотт Майерс и ему подобные - перечитывать постоянно.
1
Invader0x7F
Helper C/C++
281 / 158 / 61
Регистрация: 22.09.2016
Сообщений: 518
Завершенные тесты: 5
02.10.2016, 04:58 #13
Вот написал программу которая находит все комбинации чисел в сумме дающие число x = 100 заданной длины count = 5.
Извините пожалуйста за опоздание, но вчера имел много работы и не мог быстро выполнить ваше задание.
В отличие от других программ данная программа находит все комбинации в том числе и заданную вами.
К данному посту прилагаю exe-шник и скриншот для демонстрации (см. аттачмент ниже).

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
#include <map>
#include <ctime>
#include <vector>
#include <utility>
#include <iostream>
#include <algorithm>
#include <functional>
 
using std::multimap;
using std::vector;
 
using namespace std;
 
const int N = 9;
 
int main()
{
    std::vector<int> magic_values;
    std::vector<int> A = { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
 
    int x = 0, count = 0;
    std::cout << "x = "; cin >> x;
    std::cout << "count = "; cin >> count;
 
    int cnt = 0, n_val = x;
    for (; n_val >= 1; n_val /= 10)
        cnt++;
 
    for (int t = 0; t < N; t += cnt)
        for (int pos = t; pos < t + cnt; pos++)
            for (int n_count = (t + cnt) - pos; n_count > 0; n_count--)
            {
                int n_digit = n_count - 1; n_val = 0;
                for (int t1 = pos; t1 < pos + n_count; t1++, n_digit--)
                    n_val += A[t1] * int(pow(10.0, n_digit));
 
                magic_values.push_back(n_val);
            }
 
    for (int r = cnt; r < N; r += cnt)
        magic_values.push_back(A[r] + A[r - 1] * 10);
 
    std::sort(magic_values.begin(), magic_values.end(), std::greater<int>());
 
    std::multimap<vector<int>,int> mvsets;
 
    std::vector<int> sampl_v;
    sampl_v.push_back(magic_values[2]);
 
    mvsets.insert(std::make_pair(sampl_v, magic_values[2]));
 
    for (auto it = mvsets.begin(); it != mvsets.end(); it++)
    {
        std::vector<int> magic_seq = it->first;
        int n_val = magic_seq[magic_seq.size() - 1];
 
        if (it->second != x && magic_seq.size() != count)
        {
            std::size_t i = 0; bool found = false;
            while (i < magic_values.size() && !found)
                found = magic_values[i++] == std::abs(n_val) ? 1 : 0;
 
            for (std::size_t t = i; t < magic_values.size(); t++)
            {
                std::vector<int> new_seq = magic_seq;
                new_seq.push_back(it->second > x ? -magic_values[t] : magic_values[t]);
 
                int sum = 0;
                for (std::size_t v = 0; v < new_seq.size(); v++)
                    sum += new_seq[v];
 
                mvsets.insert(std::make_pair(new_seq, sum));
            }
        }
 
        else
        {
            for (auto&& a : it->first)
                std::cout << a << " ";
            std::cout << endl;
        }
    }
 
    std::cin.get();
    std::cin.get();
 
    return 0;
}
1
Миниатюры
Заданы цифры - расставить знаки сложения и вычитания так, чтобы получилось выражение с заданным результатом  
Вложения
Тип файла: zip magic_nums.zip (48.0 Кб, 1 просмотров)
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16
24.10.2016, 21:01  [ТС] #14
Mr.X, Здравствуй!) Не мог бы ты добавить комментарии к своему коду пожалуйста.
0
24.10.2016, 21:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.10.2016, 21:01
Привет! Вот еще темы с ответами:

Подставить в заданное выражение знаки +,-,*,/ так, чтобы выражение было истинным - C++
Помогите плз! Надо подставить в заданное выражение знаки +,-,*,/ так, чтобы выражение было истинным: ((((((1 2) 3) 4) 5) 6)=36 ...

Расставить знаки арифметических операций так, чтобы сошелся результат - C++
Разработать программу, отыскивающую такую расстановку знаков арифметических операций +, -, *, / вместо знака ? в выражении ((((1?2) ?...

В выражении расставить знаки так, чтобы результат вычислений был равен 35 - C++
В выражении (((( 1 ? 2 ) ? 3 ) ? 4 ) ? 5 ) ? 6 вместо каждого знака ? поставить знак одной из операций + , - , * , / так , чтобы...

Переставить цифры местами так, чтобы получилось большее число - C++
Дано число. Если можно переставить его цифры так, чтобы получилось большее число, выведите YES, в противном случае выведите NO....


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

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru