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

Разобраться с алгоритмом задачи - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Найти в массиве три последовательных элемента, сумма которых максимальна http://www.cyberforum.ru/cpp-beginners/thread1839766.html
3) Найдите три последовательных элементов, сумма которых максимальна, в числовом массиве из 30 элементов.
C++ Программа шифрования и дешифрования Программа должна обеспечивать: • шифрование информации, находящейся в текстовом файле, с записью результата в другой текстовый файл,, а ключевого потока — в третий текстовый файл; • ввод ключа с... http://www.cyberforum.ru/cpp-beginners/thread1839739.html
Подпрограмму использовать в программе C++
Написать подпрограмму подсчета стоимости товара с учетом скидки 3%, если стоимость больше 100грн. Использовать подпрограмму для подсчете стоимости покупки десяти товаров.
Задача Иосифа Флавия C++
Всем привет. Помогите пожалуйста с этой задачей. Никак допедрить не могу. вот код: #include<iostream> #include<locale.h> using namespace std; int main(void) {
C++ Вычислить значения выражений http://www.cyberforum.ru/cpp-beginners/thread1839712.html
вычислить значения выражений: a = ln (y^-sqrt|x|) (x - y/2) + sin^2 arcctg(z) 1) при x=-15.246; y=4.642x10^-3; z=2000.1 для проверки a=-182.036 2) ++d<=f++, при d=4; f=4 3) 054|0xb1^16 4)...
C++ Написать программу, печатающую фамилию ученика и его инициалы Заданы фамилия, имя и отчество учащегося, разделенные пробелами. Напишите программу, печатающую фамилию ученика и его инициалы. подробнее

Показать сообщение отдельно
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 16

Разобраться с алгоритмом задачи - C++

01.11.2016, 13:51. Просмотров 205. Ответов 5
Метки (Все метки)

Помогите разобраться с алгоритмом, как работает программа. Я понимаю что здесь 38 перестановок. Но мне нужно знать как именно работает эта программа, точный алгоритм.

Вот задача:

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

Вот код:
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
#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
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru