Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.81/32: Рейтинг темы: голосов - 32, средняя оценка - 4.81
0 / 0 / 0
Регистрация: 04.11.2019
Сообщений: 8

Расставить между парами соседних цифр числа А арифметические знаки, чтобы результат выражения стал равен N

04.11.2019, 09:48. Показов 6898. Ответов 34

Студворк — интернет-сервис помощи студентам
Доброго времени суток. Дали решить вот такую задачку:

Даны шестизначное неотрицательное число и целое неотрицательное число N. Расставьте между парами соседних цифр знаки арифметических операций (+, -, *) чтобы результат выражения стал равен N. Все решения вывести на экран и указать сколько их. Значение выражения вычисляется с учетом приоритета заданных арифметических операций.

Пока не знаю, с чего начать написание программы. Решать ли это перебором? Думаю, что нет. Но на ум пока не приходит способ решения. Хотелось бы услышать советы/рекомендации чтобы начать продвигаться в решении.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.11.2019, 09:48
Ответы с готовыми решениями:

Расставить арифметические знаки так, чтобы соблюдалась истинность выражения
Вводится многозначное число, затем число, которое надо получит из цифр первого, программа должна расставить знаки (+,-,*,/) или...

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

Расставить арифметические знаки между цифрами, чтобы выполнялось равенство
Если у нас есть пример, в котором не выполняется равенство, допустим: 1 + 2 + 3 + 4 + 5 + 6 = 0 И пользователь должен изменить знаки...

34
0 / 0 / 0
Регистрация: 04.11.2019
Сообщений: 8
04.11.2019, 19:29  [ТС]
Студворк — интернет-сервис помощи студентам
Ребят, есть какие-то идеи в реализации этой задачи?
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
04.11.2019, 19:41
Хм.. Полная предыдущая страница идей
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
04.11.2019, 19:48
Цитата Сообщение от M0deste Посмотреть сообщение
Ребят, есть какие-то идеи в реализации этой задачи?
а чего париться, перебери тупо все возможные варианты в лоб, потом распарсь получившееся выражение через стек с приоритетами операций.

Добавлено через 1 минуту
или рекурсивным спуском
0
0 / 0 / 0
Регистрация: 04.11.2019
Сообщений: 8
04.11.2019, 20:47  [ТС]
_stanislav, а как мне нормально сделать операцию объединение пары рядом идущих цифр в число?
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.11.2019, 21:17
Цитата Сообщение от M0deste Посмотреть сообщение
операцию объединение пары рядом идущих цифр в число?
Пример. Пусть есть строка
C++
1
2
3
4
5
6
7
char x[] = "123ab";
N = 0;
for(i=0; x[i] <= '9' && x[i] >= '0'; i++)
  int c = x[i] - '0';
  N = 10*N + c;
}
// N = 123
Nj то есть сканируете транслируемую строку, пока не встретится цифра. Встретилась? С этой точки применяете вышеприведенный код. i вам скажет сколько цифр было прочитано.
0
863 / 513 / 215
Регистрация: 19.01.2019
Сообщений: 1,216
04.11.2019, 22:13
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
#include <stdio.h>
 
int parse(const char* begin, const char* end) {
    int a, b;
    const char* cit;
 
    sscanf(begin, "%d", &a);
    for (cit = begin + 1; cit < end; ++cit) {
        if (*cit == '+' || *cit == '-') {
            return a + parse(cit, end);
        }
        if (*cit == '*') {
            sscanf(++cit, "%d", &b);
            a *= b;
        }
        else if (*cit == '/') {
            sscanf(++cit, "%d", &b);
            a /= b;
        }
    }
    return a;
}
 
void comb(const char* num, char* res, char* resIt, int cmp) {
    *resIt = *num;
    if (*(num + 1) == '\0') {
        *(resIt + 1) = '\0';
        if (parse(res, resIt) == cmp)
            printf("%s = %d\n", res, cmp);
        return;
    }
    *(resIt + 1) = '+';
    comb(num + 1, res, resIt + 2, cmp);
    *(resIt + 1) = '-';
    comb(num + 1, res, resIt + 2, cmp);
    *(resIt + 1) = '*';
    comb(num + 1, res, resIt + 2, cmp);
    comb(num + 1, res, resIt + 1, cmp);
}
 
void foo(const char* digWord, int num_to_match) {
    char tmp[12];
    comb(digWord, tmp, tmp, num_to_match);
}
 
 
int main(void)
{
    char numWord[7];
    int num;
    scanf("%s%d", numWord, &num);
    foo(numWord, num);
 
    return 0;
}
1
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
04.11.2019, 22:28
_stanislav, Хочу попытаться ответить на твой вопрос - Как такое получается? Пишу в тему, а не в личку - а вдруг кому-то еще будет интересно. Скажем, как организовать перебор 1024 вариантов, не повторившись и ничего не пропустив. Я часто представляю, а как бы я стал решать вручную, на бумажке....
Вот есть 5 мест. На каждое из них можно поставить ничего,+,-,*. Писать символы в лом. Заменю-ка их цифрами
000000 - всюду ничего
000001 - в последней позиции "+"
000002 - "-"
000003 - "*"
Дальше некуда. Значит
000010 (4-ичная с/с напросилась сама
Ну и так далее до 333333
А записать это в коде уже сущие пустяки
1
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2019, 01:47
Лучший ответ Сообщение было отмечено M0deste как решение

Решение

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
#include <iostream>
#include <string>
#include <vector>
#include <sstream>
#include <iterator>
 
typedef std::vector<std::string> sv_t;
 
std::string s, o = "+-*_";
int n;
 
sv_t split(std::string t) {
    std::istringstream iss(t);
    sv_t v((std::istream_iterator<std::string>(iss)), std::istream_iterator<std::string>());
    return v;
}
 
std::string join(sv_t v) {
    std::string s = "";
    for (auto x : v) s += (s == "" || x == "" ? "" : " ") + x;
    return s;
}
 
int find(sv_t v, std::string o) { // cause std::find can not work with strings here....
    for(int i = 0; i<v.size(); i++) if (v[i] == o) return i;
    return -1;
}
 
int op(sv_t v, int i) {
    int l = std::stoi(v[i-1]), r = std::stoi(v[i+1]);
    return v[i] == "*" ? l*r : v[i] == "+" ? l+r : l-r;
}
 
int test(std::string t) {
    sv_t r;
    while (true) {
        r.push_back(t);
        sv_t v = split(t); 
        int i = find(v, "*");
        if (i < 0) if (v.size() > 1) i = 1; else break;
        v[i] = std::to_string(op(v, i)); v[i-1] = ""; v[i+1] = "";
        t = join(v);
    }
    if (std::stoi(t) == n) {
        for (auto x : r) std::cout << x << "\n";
        std::cout << "\n";
        return 1;
    } else return 0;
}
 
void f(int i, std::string t) {
    if (i == s.size()) test(t);
    else for (auto c : o) f(i+1, c=='_' ? t+s[i] : t+" "+c+" "+s[i]);
}
 
int main() {
    std::cin >> s >> n;
    std::cout << s << "\n\n";
    f(1, s.substr(0,1));
}
Code
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
897413
 
8 + 9 + 7 * 4 + 13
8 + 9 + 28 + 13
17 + 28 + 13
45 + 13
58
 
8 - 9 + 7 + 4 * 13
8 - 9 + 7 + 52
-1 + 7 + 52
6 + 52
58
 
8 * 9 - 7 - 4 - 1 * 3
72 - 7 - 4 - 1 * 3
72 - 7 - 4 - 3
65 - 4 - 3
61 - 3
58
 
8 * 9 - 7 - 4 * 1 - 3
72 - 7 - 4 * 1 - 3
72 - 7 - 4 - 3
65 - 4 - 3
61 - 3
58
 
89 + 7 - 41 + 3
96 - 41 + 3
55 + 3
58
 
89 - 7 * 4 - 1 * 3
89 - 28 - 1 * 3
89 - 28 - 3
61 - 3
58
 
89 - 7 * 4 * 1 - 3
89 - 28 * 1 - 3
89 - 28 - 3
61 - 3
58
PS С++ - это какой-то кошмар из каменного века...
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.11.2019, 08:02
Цитата Сообщение от _Ivana Посмотреть сообщение
С++ - это какой-то кошмар из каменного века
не кошмар покажи

Добавлено через 1 час 4 минуты
Цитата Сообщение от Байт Посмотреть сообщение
Вот есть 5 мест.
почему 5 а не 4 ведь:
Цитата Сообщение от Байт Посмотреть сообщение
На каждое из них можно поставить ничего,+,-,*.
Добавлено через 1 минуту
Цитата Сообщение от M0deste Посмотреть сообщение
а как мне нормально сделать операцию объединение пары рядом идущих цифр в число?
я бы не объединение делал, а разделение наверно.
0
Диссидент
Эксперт C
 Аватар для Байт
27714 / 17332 / 3810
Регистрация: 24.12.2010
Сообщений: 38,978
05.11.2019, 10:17
Цитата Сообщение от _stanislav Посмотреть сообщение
почему 5 а не 4 ведь:
4 закорючки (nil,+,-,*). А мест-то именно 5 (между циферкам). Кстати, в моих примерах поста 27 неточность. Должны быть 5-значные числа 00000, 00001 ...
1
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.11.2019, 10:24
Цитата Сообщение от Байт Посмотреть сообщение
4 закорючки (nil,+,-,*). А мест-то именно 5 (между циферкам).
странные однако люди, все думают одинаково но по разному. кто то разделением решить задачу хочет, а кто то объединением.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2019, 11:43
Цитата Сообщение от _stanislav Посмотреть сообщение
не кошмар покажи
Lisp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
(defn test [t n]
  (let [[z p] (loop [t t r [t]]
                (let [v (str/split t #"\s+")]
                  (if (= 1 (count v))
                    [(-> v first read-string) r]
                    (let [i (max 1 (.indexOf v "*"))
                          [i- i+] ((juxt dec inc) i)
                          [a b] (map #(read-string (v %)) [i- i+])
                          t (str/join " " (-> (subvec v 0 i-)
                                              (conj (({"*" * "+" + "-" -} (v i)) a b))
                                              (into (subvec v (inc i+)))))]
                      (recur t (conj r t))))))]
    (when (= n z) (println) (doseq [s p] (println s)))))
 
(defn task [a n]
  (let [f (fn f [s t]
            (if (= "" s)
              (test t n)
              (doseq [c "+-*_"]
                (f (subs s 1) (str t (if (= \_ c) "" (str " " c " ")) (first s))))))]
    (println a)
    (f (subs (str a) 1) (subs (str a) 0 1))))
 
(task 897413 58)
Цитата Сообщение от _stanislav Посмотреть сообщение
кто то разделением решить задачу хочет, а кто то объединением.
а кто-то поиском халявы на форуме
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.11.2019, 11:58
Цитата Сообщение от _Ivana Посмотреть сообщение
(defn test [t n]
* (let [[z p] (loop [t t r [t]]
* * * * * * * * (let [v (str/split t #"\s+")]
* * * * * * * * * (if (= 1 (count v))
* * * * * * * * * * [(-> v first read-string) r]
* * * * * * * * * * (let [i (max 1 (.indexOf v "*"))
* * * * * * * * * * * * * [i- i+] ((juxt dec inc) i)
* * * * * * * * * * * * * [a b] (map #(read-string (v %)) [i- i+])
* * * * * * * * * * * * * t (str/join " " (-> (subvec v 0 i-)
* * * * * * * * * * * * * * * * * * * * * * * (conj (({"*" * "+" + "-" -} (v i)) a b))
* * * * * * * * * * * * * * * * * * * * * * * (into (subvec v (inc i+)))))]
* * * * * * * * * * * (recur t (conj r t))))))]
* * (when (= n z) (println) (doseq [s p] (println s)))))
(defn task [a n]
* (let [f (fn f [s t]
* * * * * * (if (= "" s)
* * * * * * * (test t n)
* * * * * * * (doseq [c "+-*_"]
* * * * * * * * (f (subs s 1) (str t (if (= \_ c) "" (str " " c " ")) (first s))))))]
* * (println a)
* * (f (subs (str a) 1) (subs (str a) 0 1))))
(task 897413 58)
что за наскальные узоры

Добавлено через 1 минуту
ты только близко не воспринимай, я с ангельскими побуждениями.
0
4949 / 2289 / 287
Регистрация: 01.03.2013
Сообщений: 5,991
Записей в блоге: 32
05.11.2019, 11:59
Дикий народ... Это венец творения земной цивилизации, выше него только неземной хаскель.
0
"C with Classes"
2022 / 1404 / 523
Регистрация: 16.08.2014
Сообщений: 5,885
Записей в блоге: 1
05.11.2019, 12:10
Цитата Сообщение от _Ivana Посмотреть сообщение
Это венец творения земной цивилизации
займусь расшифровкой на досуге, стало интересно
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.11.2019, 12:10

Расставить среди цифр знаки арифметических операций и скобки, чтобы получить необходимый результат
Собственно, вот задача: Вводится строка не более чем из 6 цифр и некоторое целое число R. Расставить знаки арифметических операций...

Расставить между цифрами знаки +/- так, чтобы значение полученного выражения равнялось m
Ребят помогите) Дано n (n больше или равно 2) произвольных цифр А1, А2, ... Аn, где Є {1,2,...,9} и произвольное число m.Составить...

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

Расставить знаки арифметических операций между цифрами числа A, чтобы получить число B
Заданы два целых положительных числа A и B. Расставьте знаки арифметических операций (+, -, *, /) между цифрами числа A, чтобы получить...

Правильно расставить арифметические знаки между элементами массива
Добрый день.Помогите,пожалуйста,с решением такой вот задачки : Есть массив цифр - А и есть какое-то целое чило - S. Так вот,нужно...


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

Или воспользуйтесь поиском по форуму:
35
Ответ Создать тему
Новые блоги и статьи
Вступаем в новую фазу генерации favicons, векторную.
russiannick 02.11.2026
Теперь нет нужды скрывать что используется простой svg. Исходный код изображения помещаем в поле и жмем кнопку. Исходник преобразуется в вид корректный для помещения в favicon или в url(). Нажатие. . .
Генератор паролей (вариант №4)
Maks 01.11.2026
После публикации 3-го варианта генератора паролей, разослал его своим коллегам (с целью оценки), в итоге были получены следующие рекомендации: 1. Вернуть возможность использования знаков | 1 l I;. . .
Генератор паролей (вариант №3)
Maks 30.10.2026
Финальная версия генератора паролей 1С. Доработка решения в этот раз коснулась только визуальной части, а именно, добавлен реквизит ДопПараметры (тип Булево), который скрывает/ отображает реквизиты:. . .
Магическое мышление и магия, современная наука не отличима от магии (говорит ИИ Джемени)
zorxor 30.10.2026
Джемени, расскажи, пожалуйста, что такое магическое мышление, что такое магия, почему современная наука чем-то напоминает магию? Фраза «Любая достаточно развитая технология неотличима от магии». . .
За какое время ИИ может подобрать пароль по хешу (рассказывает Джемени ИИ)
zorxor 30.10.2026
Расскажи, Джемени, если известен хэш МД5, например, за сколько ИИ сможет подобрать соответствующий пароль? Искусственный интеллект (ИИ) может подобрать простой или средний по сложности пароль по. . .
Кто убил Suno? Почему наше солнышко погасло? (диалог с ИИ Джемени)
zorxor 30.10.2026
Как убивали Suno. Хронология. «Убийство» музыкальной нейросети Suno — это затяжной процесс, в котором технологический хайп стартапа разбился о жесткую реальность судебных исков от гигантов. . .
Генератор паролей (вариант №2)
Maks 30.10.2026
Обновленная версия ранее созданной обработки. Добавлены следующие реквизиты типа Булево: - Буквы; - Цифры; - Символы. Изменена логика команды "Сгенерировать" и процедуры "ПриОткрытии":. . .
Генератор паролей (вариант №1)
Maks 29.10.2026
Реализация из решения ниже выполнена исключительно по моей инициативе, дабы облегчить себе работу в создании паролей для администрируемых мною сервисов и пользователей. Самым главным критерием для. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru