Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/120: Рейтинг темы: голосов - 120, средняя оценка - 4.63
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55

Определить наименьшее число операций для того, чтобы используя заданные операции получить из числа 1 заданное число N

25.06.2021, 14:21. Показов 23637. Ответов 29
Метки с++ (Все метки)

Студворк — интернет-сервис помощи студентам
Задача с курсов сириуса, прошу смотреть на примеры ввода и вывода, спасибо заранее за помощьв решении задачи (никак не могу код написать)

Имеется калькулятор, который выполняет три операции:

прибавить к числу X единицу;
умножить число X на 2;
умножить число X на 3.
Определите, какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N.

Входные данные

Программа получает на вход одно число, не превосходящее 106.

Выходные данные

Требуется вывести одно число: наименьшее количество искомых операций.

Примеры
Ввод:
32718
Вывод:
17


Ввод:
1
Вывод:
0


Ввод:
5
Вывод:
3
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
25.06.2021, 14:21
Ответы с готовыми решениями:

Определить, какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N
Калькулятор выполняет 3 операции: Прибавить к числу единицу. Умножить число на 2. Умножить число на 3. Определите, какое наименьшее...

Какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N
Здравствуйте, не могли бы подсказать что не так или хотя бы ход мыслей этой задачи прогу прилагаю Не Сириус!!! Как все думают ...

Определите, какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N
Имеется калькулятор, который выполняет три операции: Прибавить к числу X единицу. Умножить число X на 2. Умножить число X на 3. ...

29
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
25.06.2021, 18:19
Цитата Сообщение от vitek2000 Посмотреть сообщение
Входные данные
Программа получает на вход одно число, не превосходящее 106.
Цитата Сообщение от vitek2000 Посмотреть сообщение
Примеры
Ввод:
32718
Не понял. Но 32718 больше, чем 106.
0
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
25.06.2021, 18:25  [ТС]
TheCalligrapher, там 10 в 6, не заметил что перекопировалось
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
26.06.2021, 14:11
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
#include <iostream>
using namespace std;
 
void calc(int curr, int count, int target, int & min_op)
{
   if (curr==target)
   {
       if (min_op==-1)
          min_op=count;
       else
          min_op=min(count,min_op);
       return;
   }
   calc(curr+1,count+1,target,min_op);
   if ((curr*2)<target) calc(curr*2,count+1,target,min_op);
   if ((curr*3)<target) calc(curr*3,count+1,target,min_op);
}
 
int main() {
    int n,min_op=-1;
    cin >> n;
    calc(1,0,n,min_op);
    cout << min_op << endl;
    return 0;
}
2
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
26.06.2021, 14:53  [ТС]
Catstail, спасибо большое за код, проверил в вижуал студио, все работает, а вот почему то сириус не принимает...
не понимаю в чем проблема, спасибо за то, что хоть суть решения видна
Миниатюры
Определить наименьшее число операций для того, чтобы используя заданные операции получить из числа 1 заданное число N  
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
26.06.2021, 14:56
Возможно, не хватает стекового пространства.
1
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
26.06.2021, 15:23  [ТС]
Catstail, возможно, только вот не знаю как решить данную проблему, постараюсь поискать...

Добавлено через 23 минуты
Catstail, попытался использовать строку

#pragma comment(linker, "/STACK:66777216")

но не работает, не хвататет все равно
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
26.06.2021, 16:34
Значит, нужно отсекать лишние рекурсивные вызовы.
1
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
26.06.2021, 17:02  [ТС]
Catstail, ну да, правда не понимаю какие именно, чтобы код работал, не подскажете??
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
26.06.2021, 17:18
vitek2000, Можно зайти с другого конца. Если целевое число n кратно трем, то очевидно, что минимальное число операций будет равно n/3. Если число при делении на три дает остаток 1, оно имеет вид 3k+1 то к-во операций будет k+1. Соответственно для числа вида 3k+2 - к-во операций = k+2. Это порождает следующий простейший код:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>
using namespace std;
 
int main() {
    int n,k;
    cin >> n;
    k=n%3
    if (k==0)
       cout << n/3 << endl;
    else if (k==1) 
       cout  << n/3+1 << endl;
    else
       cout << n/3+2 << endl;
    return 0;
}
2
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
26.06.2021, 17:24  [ТС]
Catstail, ну кстати логично, только вот пишет неверный ответ, в самом первом тесте с числом 32718 выводит не 17 а 10906, все таки по другому надо, возможно совместить как-то.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
26.06.2021, 17:58
vitek2000, да, от жары я лопухнулся. Нужно тянуть до ближайшей степени тройки. 3n получается за n операций. Сейчас подумаю.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.06.2021, 18:49
Цитата Сообщение от Catstail Посмотреть сообщение
Можно зайти с другого конца. Если целевое число n кратно трем, то очевидно, что минимальное число операций будет равно n/3. Если число при делении на три дает остаток 1, оно имеет вид 3k+1 то к-во операций будет k+1. Соответственно для числа вида 3k+2 - к-во операций = k+2. Это порождает следующий простейший код:
??? Мы не складываем тройки, а перемножаем.

---

Навскидку: а не пойдет ли тут просто жадный подход:

- если число делится на 3, то делим на 3.
- если число делится на 2, то делим на 2.
- иначе вычитаем 1.

Никакой поиска, т.е. рекурсии, не нужно.
2
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38161 / 21096 / 4306
Регистрация: 12.02.2012
Сообщений: 34,680
Записей в блоге: 14
26.06.2021, 18:55
Нет, боюсь, что без рекурсии тут не обойтись. Но она сильно ветвящаяся. Поэтому нужна мемоизация (чтобы не перевычислять одно и то же). Или есть какое-либо математическое решение...

Добавлено через 29 секунд
TheCalligrapher, да, это я сильно ошибся.

Добавлено через 2 минуты
TheCalligrapher, похоже, Ваш алгоритм - это то, что нужно! Я перемудрил.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.06.2021, 19:03
Нет, мое предположение неверно уже для 10.

По моему предположению 10 / 2 = 5 - 1 = 4 / 2 = 2 / 2 = 1
А можно лучше 10 - 1 = 9 / 3 = 3 / 3 = 1

Однако предложенная вами рекурсия без мемоизации если и не переполнит стек, то будет работать очень долго.
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
26.06.2021, 19:20
Лучший ответ Сообщение было отмечено vitek2000 как решение

Решение

А что динамика с простой мемоизацией не прокатывает? 10^6 - не так уж много.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<vector>
#include<iostream>
 
int main()
{
    int x;
    std::cin >> x;
    std::vector<int> mem(x + 1, 0);
    for(int i = 2; i <= x; i++) {
        auto min_ops = mem[i - 1] + 1;
        if(i % 2 == 0) min_ops = std::min(min_ops, mem[i / 2] + 1);
        if(i % 3 == 0) min_ops = std::min(min_ops, mem[i / 3] + 1);
        mem[i] = min_ops;
    }
    std::cout << mem.back() << std::endl;
    return 0;
}
3
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.06.2021, 20:01
Цитата Сообщение от woldemas Посмотреть сообщение
А что динамика с простой мемоизацией не прокатывает?
??? А о чем, по-вашему, шла речь выше?
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
26.06.2021, 20:05
TheCalligrapher, так тут дольше речь вести, чем написать.
Другое дело, что у ТС могут ограничения по памяти стоять.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12919 / 6787 / 1817
Регистрация: 18.10.2014
Сообщений: 17,169
26.06.2021, 20:10
Цитата Сообщение от woldemas Посмотреть сообщение
так тут дольше речь вести, чем написать.
"Написать"? Написать - задача автора вопроса, а не отвечающих. Хотя не все и не всегда это понимают...
1
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
26.06.2021, 21:16  [ТС]
woldemas, спасибо большое вам за решение, и всем отвечающим за дискуссию. И в правду мемоизацию надо использовать, динамическое программирование как никак. Всем удачи и еще раз спасибо!!
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
26.06.2021, 21:16
Помогаю со студенческими работами здесь

Определите, какое наименьшее число операций необходимо для того, чтобы получить из числа 1 заданное число N
Задание Исполнитель «Калькулятор» может с заданным числом X выполнить одну из трех операций и получить новое число. Возможные операции: ...

Определите, какое наименьшее число операций необходимо, чтобы получить из числа 1 число N
Имеется калькулятор, который выполняет три операции: 1. Прибавить к числу X единицу. 2. Умножить число X на 2. 3. Умножить число X на...

Из числа N, используя наименьшее количество операций, получить число 1000
Есть число N и два действия: умножить на 2 вычесть 1 Надо из числа N, используя наименьшее количество операций,...

Заданы 6 цифр и число. Используя скобки и бинарные арифметические операции +,-,*,/, получить заданное число
помогите написать программу на C#, как-нибудь отблагодарю Заданы 6 цифр и число. Используя скобки и бинарные арифметические операции...

Нужно определить, сколько существует способов получить n число из x числа используя заданные математические действия
здравствуйте, здравствуйте, столкнулся с проблемкой. Нужно определить, сколько существует способов получить число y из числа x используя...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru