0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 9
1

Получить заданное число m сложением/вычитанием цифр

22.09.2014, 17:31. Показов 4597. Ответов 81
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Очень-очень нужна помощь!
дано n (n>=2) количество цифр от 1 до 9 и любое число m. Написать программу расстановки между каждой парой чисел, записанных именно в таком порядке, знаков "+" и "-" так, чтобы значение полученного выражения равнялось m.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
22.09.2014, 17:31
Ответы с готовыми решениями:

Дано натуральное число. Определить сумму m его последних цифр. Если заданное число – менее чем m-значное, то
Дано натуральное число. Определить сумму m его последних цифр. Если заданное число – менее чем...

В матрице состоящей из цифр найти цепочку составляющую заданное число
Дана квадратная матрица F, состоящая из цифр. Найти в ней цепочку цифр, составляющую заданное число...

Вывести на экран сумму кодов (по ASCII) цифр входящих в заданное число
help

Получить число, состоящее из суммы цифр, если оно четное - найти сумму двух первых цифр, иначе - разность
Даны цифры двух целых чисел: трехзначного а3а2а1 и двусмысленного b2b1 где а1b1- число единиц, а2b2...

81
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.09.2014, 17:41 2
Roshki, можно примерчик входных и выходных данных?
0
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 9
22.09.2014, 17:47  [ТС] 3
КОП, ну, n=6, например, а m=10:)
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
22.09.2014, 17:56 4
Roshki, выходные данные где? (что увидит пользователь после выполнения при n=6 m=10)
просто не очень понимаю
Цитата Сообщение от Roshki Посмотреть сообщение
дано n (n>=2) количество цифр от 1 до 9
каких цифр то? по порядку 1, 2, 3... или задаваемых пользователем.
0
0 / 0 / 0
Регистрация: 17.09.2014
Сообщений: 9
22.09.2014, 18:05  [ТС] 5
КОП, должно на экране появится что-то вроде "2+3+5+6-4-2=10"
в задании не уточнено, задаются ли цифры пользователем... пользователем наверное)
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
22.09.2014, 23:21 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
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
/////////////////////////////////////////////////////////////////////////////////////////
//Счастливый билет, но не совсем
//Дано n (n>=2) количество цифр от 1 до 9 и любое число m. Написать программу расстановки 
//между каждой парой чисел, записанных именно в таком порядке, знаков "+" и "-" так, чтобы 
//значение полученного выражения равнялось m.
/////////////////////////////////////////////////////////////////////////////////////////
#include <algorithm>
#include <bitset>
#include <cstdlib>
#include <ctime>
#include <functional>
#include <iostream>
#include <iterator>
#include <numeric>
#include <sstream>
#include <string>
#include <vector>
/////////////////////////////////////////////////////////////////////////////////////////
const   int     MIN_DIGITS_COUNT    =   2;
const   int     MAX_DIGITS_COUNT    =   10;
const   char    ZERO_SYMB           =   '0';
/////////////////////////////////////////////////////////////////////////////////////////
typedef std::string                             T_str;
typedef std::vector     < int               >   T_digits;
typedef std::bitset     < MAX_DIGITS_COUNT  >   T_operations;
/////////////////////////////////////////////////////////////////////////////////////////
int     get_rand_int_in_segment
    (
        int     min_val,
        int     max_val
    )
{
    return  rand() % ( max_val - min_val + 1 ) + min_val;
}
/////////////////////////////////////////////////////////////////////////////////////////
T_digits    get_rand_digits()
{
    static  const   int     MIN_DIGIT   =   1;
    static  const   int     MAX_DIGIT   =   9;
 
    int     rand_digits_count   =   get_rand_int_in_segment
                                        (
                                            MIN_DIGITS_COUNT,
                                            MAX_DIGITS_COUNT
                                        );
 
    T_digits    digits( rand_digits_count );
 
    std::generate
        (
            digits.begin    (),
            digits.end      (),
 
            std::bind
                (
                    get_rand_int_in_segment,
                    MIN_DIGIT,
                    MAX_DIGIT
                )
        );
 
    return  digits;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_digits( T_digits  const   &   digits )
{
    std::copy
        (
            digits.begin                (),
            digits.end                  (),
            std::ostream_iterator<int>  ( std::cout )
        );
}
/////////////////////////////////////////////////////////////////////////////////////////
int     get_result_for_digits_and_operatioins_string
    (
        T_digits    const   &   digits,
        T_str       const   &   operations_string
    )
{
    return  std::inner_product
                (
                    digits.begin                () + 1,
                    digits.end                  (),
                    operations_string.begin     (),
                    digits.front                (),
                    std::plus<int>              (),
 
                    []                          (
                                                    int     digit,
                                                    char    op_flag
                                                )
                    {
                        return  op_flag     ==  ZERO_SYMB
                                    ?   -digit
                                    :   digit;
                    }
                );
}
/////////////////////////////////////////////////////////////////////////////////////////
bool   successfully_for_digits_and_result_set_operations_string
    (
        T_digits    const   &   digits,
        int                     result,
        T_str               &   operations_string
    )
{
    bool                bool_res        =   false;
    unsigned long long  variants_count  =   1 << ( digits.size() - 1 );
 
    for( unsigned long long  i = 0; i < variants_count; ++i )
    {
        operations_string   =   T_operations(i).to_string();
 
        operations_string.assign
            (
                operations_string.rbegin(),
                operations_string.rbegin() + digits.size() - 1
            );
 
        bool_res    =       result
 
                        ==  get_result_for_digits_and_operatioins_string
                                (
                                    digits,
                                    operations_string
                                );
 
        if( bool_res )
        {
            break;
        }
    }//for
 
    return  bool_res;
}
/////////////////////////////////////////////////////////////////////////////////////////
void    print_arithmetic_expression_for_digits_and_result
    (
        T_digits    const   &   digits,
        int                     result
    )
{
    static  const   char    SPACE_SYMB  =   ' ';
    static  const   char    PLUS_SYMB   =   '+';
    static  const   char    MINUS_SYMB  =   '-';
 
    T_str   operations_string;
 
    if  (
            !successfully_for_digits_and_result_set_operations_string
                (
                    digits,
                    result,
                    operations_string
                )
        )
    {
        std::cout   <<  "Решения не существует."
                    <<  std::endl;
    }
    else
    {
        std::transform
            (
                operations_string.begin         (),
                operations_string.end           (),
                digits.begin                    (),
                std::ostream_iterator<T_str>    ( std::cout ),
 
                []                              (
                                                    char    op_flag,
                                                    int     digit
                                                )
                                                ->T_str
                {
                    std::ostringstream  sout;
 
                    sout    <<  digit
                            <<  SPACE_SYMB
 
                            <<  (
                                    op_flag     ==  ZERO_SYMB
                                        ?   MINUS_SYMB
                                        :   PLUS_SYMB
                                )
 
                            <<  SPACE_SYMB;
 
                    return  sout.str();
                }
            );
 
            std::cout   <<  digits.back()
                        <<  " = "
                        <<  result
                        <<  std::endl;
    }//else
 
    std::cout   <<  std::endl
                <<  std::endl
                <<  std::endl
                <<  std::endl;
}
/////////////////////////////////////////////////////////////////////////////////////////
int     main()
{
    std::locale::global(std::locale(""));
    srand(unsigned(time(0)));
    T_digits    digits  =   get_rand_digits();
 
    for(;;)
    {
        print_digits( digits );
 
        std::cout   <<  std::endl
                    <<  "result = ";
 
        int     result  =   0;
        std::cin    >>  result;
 
        print_arithmetic_expression_for_digits_and_result
            (
                digits,
                result
            );
    }//for
}
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
22.09.2014, 23:25 7
Mr.X, размер кода внушает, в логику его работы не полез, но скажите, что он выведет при исходном наборе
5, 2, 2 при
м = 5 ?
м = 6 ?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
22.09.2014, 23:41 8
Цитата Сообщение от _Ivana Посмотреть сообщение
Mr.X, размер кода внушает, в логику его работы не полез, но скажите, что он выведет при исходном наборе
5, 2, 2 при
м = 5 ?
м = 6 ?
А запускать не пробовали?
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
22.09.2014, 23:47 9
Цитата Сообщение от Mr.X Посмотреть сообщение
А запускать не пробовали?
Нет конечно. Мне интересно с людьми поговорить (не хотите, не настаиваю ), свою программу написать. А чужие программы запускать не интересно, простите.
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
22.09.2014, 23:53 10
Цитата Сообщение от _Ivana Посмотреть сообщение
Нет конечно. Мне интересно с людьми поговорить (не хотите, не настаиваю ), свою программу написать. А чужие программы запускать не интересно, простите.
Понятно. А вы как думаете, что она выведет?
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
22.09.2014, 23:55 11
Я не думаю, хотел у вас узнать, отработает ли она все варианты, если их не один, например Я не разбирал ваш код, ваши коды всегда так крайне неудобно на мой вкус отформатированы и содержат в несколько раз больше строк, чем можно их написать, поэтому как раз ваши примеры мне всегда тяжело разбирать Проще свою реализацию написать.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.09.2014, 00:01 12
Цитата Сообщение от _Ivana Посмотреть сообщение
отработает ли она все варианты
этого не требуется ведь, зачем все перебирать
Mr.X, нашел один косяк: не работает, если первый элемент должен быть с минусом (диагностика пальцем в небо, не тестил спецом) имею ввиду такой набор данных к примеру: 123 = 6 и 123 = -6 (тут решения нет)
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
23.09.2014, 00:03 13
Цитата Сообщение от КОП Посмотреть сообщение
этого не требуется ведь, зачем все перебирать
Из сумбурных слов ТС нельзя точно сказать, что требуется, а что нет. Но с моей точки зрения программа должна выдать все варианты.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.09.2014, 00:05 14
_Ivana, IDE вам в список процессов
Цитата Сообщение от _Ivana Посмотреть сообщение
что требуется
ТС тут не на правах заказчика, а на "дают бери, бьют беги"
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.09.2014, 00:06 15
Цитата Сообщение от КОП Посмотреть сообщение
Mr.X, нашел один косяк: не работает, если первый элемент должен быть с минусом (диагностика пальцем в небо, не тестил спецом) имею ввиду такой набор данных к примеру: 123 = 6 и 123 = -6 (тут решения нет)
Цитата Сообщение от КОП Посмотреть сообщение
этого не требуется ведь
Цитата Сообщение от Roshki Посмотреть сообщение
расстановки между каждой парой чисел, записанных именно в таком порядке, знаков "+" и "-"
***
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
23.09.2014, 00:06 16
Цитата Сообщение от КОП Посмотреть сообщение
тут решения нет
что, унарные минусы не разрешаем, только бинарные операции?
0
Эксперт С++
3225 / 1752 / 436
Регистрация: 03.05.2010
Сообщений: 3,867
23.09.2014, 00:10 17
Цитата Сообщение от _Ivana Посмотреть сообщение
ваши коды всегда так крайне неудобно на мой вкус отформатированы и содержат в несколько раз больше строк, чем можно их написать, поэтому как раз ваши примеры мне всегда тяжело разбирать
Да? А мне наоборот очень трудно читать, когда все в строчку свалено, и приходится все это разгребать, пересчитывая скобки. А строчки экономить, да еще в ущерб ясности программы - это, мне кажется, типично сишный подход.
0
1123 / 794 / 219
Регистрация: 15.08.2010
Сообщений: 2,185
23.09.2014, 00:15 18
Mr.X, ах да, забыл про это условие. Тогда простите, все правильно работает
0
4820 / 2286 / 287
Регистрация: 01.03.2013
Сообщений: 5,970
Записей в блоге: 29
23.09.2014, 00:19 19
Спровоцировали - пишу свою реализацию Выложу - сравним. Первый в жизни консольный проект у меня будет
0
221 / 166 / 47
Регистрация: 17.07.2012
Сообщений: 587
23.09.2014, 00:46 20
я тоже кину решение(не переборное)

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
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
#include <iostream>
#include <iomanip>
#include <stdio.h>
#include <algorithm>
#include <string>
 
#define sz(a) (int)((a).size())
#define all(a) (a).begin(), (a).end()
 
using namespace std;
 
const int N = 1111;
 
int a[N];
bool dp[N][2 * 10 * N + 222];
int from[N][2 * 10 * N + 222];
 
int main()
{
    int n, m;
    cin >> n >> m;
 
    for(int i = 1; i <= n; i++)
        scanf("%1d", &a[i]);
 
    if(n * 9 < abs(m))
    {
        cout << "NO" << endl;
        return 0;
    }
 
    const int dif = 10000;
    dp[1][a[1] + dif] = true;
 
    for(int i = 1; i < n; i++)
    {
        for(int j = 10; j < 20000 - 10; j++)
        {
            bool cur = dp[i][j];
            if(!cur)
                continue;
 
            dp[i + 1][j + a[i + 1]] = true;
            dp[i + 1][j - a[i + 1]] = true;
            from[i + 1][j + a[i + 1]] = 1;
            from[i + 1][j - a[i + 1]] = -1;
        }
    }
 
    if(!dp[n][m + dif])
    {
        cout << "NO" << endl;
        return 0;
    }
 
    cout << "YES" << endl;
    string ans;
    ans.erase();
 
    m += dif;
 
    while(n > 1)
    {
        ans += (char)(a[n] + '0');
        int nm = m - a[n] * from[n][m];
        if(from[n][m] == 1)
            ans += '+';
        else
            ans += '-';
        n--;
        m = nm;
    }
 
    ans += (char)(a[1] + '0');
 
    reverse(all(ans));
    cout << ans << endl;
 
    return 0;
}
0
23.09.2014, 00:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.09.2014, 00:46
Помогаю со студенческими работами здесь

Разрезать круглую пиццу на заданное число кусков, делая заданное число прямолинейных разрезов ножом
Помогите, пожалуйста решить задачу. Дана пицца, имеющая форму круга. Её нужно разрезать на...

Разделить на два заданное четное натуральное число с количеством цифр меньше 100
Надо разделить на два заданное четное натуральное число с количеством цифр меньше 100. Нужно...

После каждого элемента массива состоящего из одинаковых цифр вставить заданное число
Дан массив положительных чисел а1,а2,а3…аN . Вставить в него после каждого числа, состоящего из...

Проверить, делится ли без остатка заданное натуральное число на каждую из своих цифр
Мне нужно написать прогу, но нужно выполнить её без использования строк и массивов задание такое:...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru