Форум программистов, компьютерный форум 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) -k<=!j||k/m++<<n%n<i, при любых целочисленных не равных и отличных от нуля i,j,k,n,m
C++ Написать программу, печатающую фамилию ученика и его инициалы Заданы фамилия, имя и отчество учащегося, разделенные пробелами. Напишите программу, печатающую фамилию ученика и его инициалы. подробнее

Показать сообщение отдельно
MDefs
0 / 0 / 0
Регистрация: 01.10.2016
Сообщений: 13
01.11.2016, 13:51     Разобраться с алгоритмом задачи
Помогите разобраться с алгоритмом, как работает программа. Я понимаю что здесь 38 перестановок. Но мне нужно знать как именно работает эта программа, точный алгоритм.

Вот задача:

Имеются цифры 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
}
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
Текущее время: 23:10. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru