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

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

25.06.2021, 14:21. Показов 23873. Ответов 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
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
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
38175 / 21110 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 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
38175 / 21110 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 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
38175 / 21110 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
26.06.2021, 16:34
Значит, нужно отсекать лишние рекурсивные вызовы.
1
3 / 3 / 0
Регистрация: 12.04.2021
Сообщений: 55
26.06.2021, 17:02  [ТС]
Catstail, ну да, правда не понимаю какие именно, чтобы код работал, не подскажете??
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38175 / 21110 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 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
38175 / 21110 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
26.06.2021, 17:58
vitek2000, да, от жары я лопухнулся. Нужно тянуть до ближайшей степени тройки. 3n получается за n операций. Сейчас подумаю.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
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
38175 / 21110 / 4307
Регистрация: 12.02.2012
Сообщений: 34,712
Записей в блоге: 14
26.06.2021, 18:55
Нет, боюсь, что без рекурсии тут не обойтись. Но она сильно ветвящаяся. Поэтому нужна мемоизация (чтобы не перевычислять одно и то же). Или есть какое-либо математическое решение...

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

Добавлено через 2 минуты
TheCalligrapher, похоже, Ваш алгоритм - это то, что нужно! Я перемудрил.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
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
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
26.06.2021, 20:01
Цитата Сообщение от woldemas Посмотреть сообщение
А что динамика с простой мемоизацией не прокатывает?
??? А о чем, по-вашему, шла речь выше?
1
677 / 479 / 216
Регистрация: 06.09.2013
Сообщений: 1,312
26.06.2021, 20:05
TheCalligrapher, так тут дольше речь вести, чем написать.
Другое дело, что у ТС могут ограничения по памяти стоять.
1
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12938 / 6805 / 1821
Регистрация: 18.10.2014
Сообщений: 17,224
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru