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

Решение уравнений - последовательность действий - C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 9, средняя оценка - 4.89
A1exSun
C#
51 / 51 / 1
Регистрация: 09.03.2013
Сообщений: 214
12.04.2013, 18:25     Решение уравнений - последовательность действий #1
Дано 3 числа. Между ними можно ставить знаки математических операций: сложение, вычитание, умножение, деление. Сколько различных значений может образоваться в результате вычисления полученных таким образом выражений?
Пример:
2 + 2 + 8 = 12
2 + 2 - 8 = -4
2 + 2 * 8 = 18
2 + 2 / 8 = 2.25
2 - 2 + 8 = 8
2 - 2 - 8 = -8
2 - 2 * 8 = -14
2 - 2 / 8 = 1.75
2 * 2 + 8 = 12
2 * 2 - 8 = -4
2 * 2 * 8 = 32
2 * 2 / 8 = 0.5
2 / 2 + 8 = 9
2 / 2 - 8 = -7
2 / 2 * 8 = 8
2 / 2 / 8 = 0.125
Различные значения: -14, -8, -7, -4, 0.125, 0.5, 1.75, 2.25, 8, 9, 12, 18, 32. Всего 13 значений.
Входные данные - 3 числа, выходные - количество различных значений.

Для того чтоб не делать решения уравнений "в лоб", придумал такое:
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
float calc(int i, float f, float s)
{
    switch(i)
    {
        case 0: return f + s;
        case 1: return f - s;
        case 2: return f * s;
        case 3: return f / s;
    }
    return 0;
}
 
int main(void)
{
    float a, b, ab, c;
    int i, j;
    cin>>a>>b>>c;
    int res[12];
    for (i = 0; i < 4; i++)
    {
        ab = calc(i, a, b);
        for (j = 0; j < 4; j++)
            cout<<calc(j, ab, c)<<"\n";
    }
}
Но как учесть приоритет действий?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.04.2013, 18:25     Решение уравнений - последовательность действий
Посмотрите здесь:

C++ Решение нелинейных уравнений
C++ Решение квадратных уравнений
Решение уравнений C++
Решение уравнений C++
C++ Решение уравнений с матрицами
C++ Решение квадратных уравнений
C++ последовательность действий
Выяснить, можно ли добавить в последовательность цифры и знаки арифметических действий C++
Выполнить над квадратной матрицей А порядка n последовательность действий, указанную в задании C++
C++ Решение систем уравнений
Решение уравнений на С++ C++
Выполнить над прямоугольной матрицей последовательность действий C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
A1exSun
C#
51 / 51 / 1
Регистрация: 09.03.2013
Сообщений: 214
12.04.2013, 18:38  [ТС]     Решение уравнений - последовательность действий #2
Цитата Сообщение от ValeryS Посмотреть сообщение
delete
2 / 8 = 0.25
2 + 0.25 = 2.25
abit
 Аватар для abit
260 / 259 / 33
Регистрация: 03.02.2013
Сообщений: 709
12.04.2013, 18:41     Решение уравнений - последовательность действий #3
вчера кому-то на форуме писал разбор обратной польской нотации, не нашёл что-то той темы

в общем вот код
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
#include <iostream>
#include <sstream>
#include <string>
#include <stack>
 
int main()
{
std::stack <int> st;
std::string s="11 23 +45 *32 +",str;
char symb;
int secoper,firoper,value;
std::size_t n_s = 0;
for (int i=0;i<=s.size() ;i++)
{
    symb = s[n_s];
    ++n_s;
    switch (symb)
                {
                case '+':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper+firoper;
                        st.push(value);
                        break;
                case '-':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper-firoper;
                        st.push(value);
                        break;
                case '/':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper/firoper;
                        st.push(value);
                        break;
                case '*':
                        secoper=st.top();
                        st.pop();
                        firoper=st.top();
                        st.pop();
                        value=secoper*firoper;
                        st.push(value);
                        break;
                case ' ': 
                          {
                              int num;
                              std::stringstream(str) >> num;
                              st.push(num);
                              str = "";
                          }
                case 0 : break;
                 default : str += symb;
                }
 
}
    std::cout<<st.top()<<std::endl;
    st.pop();
    system("pause");
    return 0;
}
генерируйте вместо std::string s="11 23 +45 *32 +" нужную вам последовательность действий
и приоритет можно уже алгоритмически придумать как расставить в исходную строку или заранее сделать всевозможные шаблоны

возможно поможет
A1exSun
C#
51 / 51 / 1
Регистрация: 09.03.2013
Сообщений: 214
12.04.2013, 18:56  [ТС]     Решение уравнений - последовательность действий #4
Цитата Сообщение от abit Посмотреть сообщение
вчера кому-то на форуме писал разбор обратной польской нотации, не нашёл что-то той темы
Кажется, я видел эту тему
В общем, в моем случае, быстрее сделать "в лоб".
Yandex
Объявления
12.04.2013, 18:56     Решение уравнений - последовательность действий
Ответ Создать тему
Опции темы

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