Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/4: Рейтинг темы: голосов - 4, средняя оценка - 5.00
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420

Записать в один цикл

10.09.2020, 10:44. Показов 783. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте.

Хочу попросить вашей помощи в написании как можно более короткого кода для решения следующей задачи:
Имеется метод int GetNumber (int n). Его код недоступен, но известно, что в зависимости от переданного в него значения возвращаемое им число будет либо расти но только до определённого предела. На пример при передачи единицы будет возвращена пятёрка, при передаче двойки, вернётся семь, а вот при передачи тройки уже шесть и при дальнейшем увеличении передаваемого значения результат будет только уменьшаться. Обратная ситуация так же возможно и, на пример, при передаче нуля может вернутся число восемь, при передаче минус единицы вернётся двенадцать, а при минус двух уже будет только девять. Задача - найти такое передаваемое значение при котором возврат будет максимальным. Есть отправная точка. Пусть это будет число 100, его мы будем передавать изначально.
Я эту задачу решил, но очень уж громоздко, как мне кажется. Сначала у меня идёт цикл do while в условии которого проверяется новое полученное значение с предыдущим, а в теле идёт увеличение передаваемого значения на 1. После цикла последнее полученное и переданные значения запоминаются и идёт такой же do while, но только с уменьшением передаваемого значения на 1. После него полученные ответы от двух циклов сравниваются и находится результат.

Можно ли решить эту задачу существенно проще, в один цикл, на пример?
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
10.09.2020, 10:44
Ответы с готовыми решениями:

Нормально ли для системы один и тот же цикл запускать цикл 20 раз в секунду с итерацией до 1000
Нормально ли для системы один и тот же цикл запускать цикл 20 раз в секунду с итерацией до 1000? Или это большая перегрузка для...

Один сдвоенный цикл
Ребят помогите этот код засунуть в один сдвоенный цикл, я не понимаю как сделать... Код на visual basic Задание было такое: Получить...

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

15
fly
 Аватар для I can
4943 / 4626 / 843
Регистрация: 13.04.2015
Сообщений: 9,804
10.09.2020, 10:51
Цитата Сообщение от FaceHoof Посмотреть сообщение
в один цикл, на пример?
Это еще умудриться надо, чтобы сделать в два цикла. Конечно, всё делается в один. Это же элементарная задача поиска максимального элемента.
1
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
10.09.2020, 10:56  [ТС]
I can, Что ж, для меня это элементарное совершенно не дошло. В частности не дошло как перестать искать путём увеличения значения на один и начать искать путём уменьшения, причём снова начав от исходного.
0
fly
 Аватар для I can
4943 / 4626 / 843
Регистрация: 13.04.2015
Сообщений: 9,804
10.09.2020, 11:18
Цитата Сообщение от FaceHoof Посмотреть сообщение
искать путём увеличения значения на один и начать искать путём уменьшения, причём снова начав от исходного.
Не надо этого делать. Нужно найти максимальное значение, которое возвращает функция при передаче параметра в определённом диапазоне, например от -100 о 100.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
10.09.2020, 11:22  [ТС]
I can, так, я либо что-то сейчас сильно не понимаю, либо задачу криво описал... Почему диапазон определённый? Я его совершенно не знаю.
0
fly
 Аватар для I can
4943 / 4626 / 843
Регистрация: 13.04.2015
Сообщений: 9,804
10.09.2020, 11:24
Цитата Сообщение от FaceHoof Посмотреть сообщение
Почему диапазон определённый?
От чего-то нужно начать скакать ? От какого значения нужно начинать поиск ? Или проверять все значения int ?
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
10.09.2020, 11:27  [ТС]
I can, знаете, спасибо Вам больше, я получил пищу для размышления, пойду я условия задачи пересмотрю) А то сейчас и правда выходит, что надо перебрать просто все значения int, а это просто нелепо...
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
10.09.2020, 11:41
Цитата Сообщение от FaceHoof Посмотреть сообщение
Имеется метод int GetNumber (int n). Его код недоступен
Код не доступен, но нужно больше уточнений:
  1. Всегда GetNumber (n) >= n.

  2. Всегда GetNumber (n+k) >= GetNumber (n), где k любое число > 0.

  3. Обязательно существует n для которого GetNumber (n + k) = GetNumber (n), где k любое число > 0.

  4. Задача: не зная аналитической зависимости GetNumber (n) от n, найти n из третьего пункта.
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
10.09.2020, 13:16
Цитата Сообщение от FaceHoof Посмотреть сообщение
как можно более короткого кода для решения следующей задачи:
Метод половинного деления.
Нет защиты от зацикливания при неправильной реализации GetNumber.
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
        static int GetNumber(int n)
        {
            if (n < 0)
                return n + 10;
            return 20 - 100 / (n + 10);
        }
        static void Main(string[] args)
        {
            int max = int.MaxValue;
 
            int maxFunc = GetNumber(max);
            Console.WriteLine($"Максмальное значение функции GetNumber(int n): {maxFunc}");
            int min = int.MinValue;
            while (max != min)
            {
                int current = (int)((double)max + min) / 2;
                int currFunc = GetNumber(current);
                if (currFunc > maxFunc)
                    throw new Exception("Ошибка в реализации метода \"int GetNumber(int n)\".");
                if (currFunc == maxFunc)
                    max = current;
                else if (max - 1 <= min )
                        min = max;
                else
                    min = current;
            }
 
            Console.WriteLine($"Минимальное число при котором получено {maxFunc}: {max}");
Добавлено через 9 минут
Цитата Сообщение от Элд Хасп Посмотреть сообщение
1. Всегда GetNumber (n) >= n.
Это условие игнорируется.
1
fly
 Аватар для I can
4943 / 4626 / 843
Регистрация: 13.04.2015
Сообщений: 9,804
10.09.2020, 13:19
Элд Хасп, я думаю,ни фига не выйдет, график функции (грубо) примерно такой, нужно найти х
Миниатюры
Записать в один цикл  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
10.09.2020, 13:38
Цитата Сообщение от I can Посмотреть сообщение
я думаю,ни фига не выйдет, график функции (грубо) примерно такой, нужно найти х
Откуда вы взяли этот график?
Он явно не соответствует условию задачи от TC:
Цитата Сообщение от FaceHoof Посмотреть сообщение
в зависимости от переданного в него значения возвращаемое им число будет либо расти но только до определённого предела.
То есть это обязательно монотонно-возрастающаю функция имеющая предел.

Для вашего графика, в общем виде, решения нет.
Только сплошной перебор всех чисел.

Добавлено через 3 минуты
Для задачи TC максимум функции всегда будет при int.MaxValue.
И надо найти при каком минимальном значении n достигается этот максимум.
0
fly
 Аватар для I can
4943 / 4626 / 843
Регистрация: 13.04.2015
Сообщений: 9,804
10.09.2020, 13:43
Цитата Сообщение от Элд Хасп Посмотреть сообщение
Откуда вы взяли этот график?
Из условия
Цитата Сообщение от FaceHoof Посмотреть сообщение
число будет либо расти но только до определённого предела. На пример при передачи единицы будет возвращена пятёрка, при передаче двойки, вернётся семь, а вот при передачи тройки уже шесть и при дальнейшем увеличении передаваемого значения результат будет только уменьшаться. Обратная ситуация так же возможно и, на пример, при передаче нуля может вернутся число восемь, при передаче минус единицы вернётся двенадцать, а при минус двух уже будет только девять.
1
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
10.09.2020, 13:47
I can, признаю - я не прав.
Тогда общего решения не будет.

Добавлено через 2 минуты
Тогда для поиска решения необходимо определить диапазон с одним локальным максимумом.
Без этого решить без полного перебора будет невозможно.
0
 Аватар для Enifan
1849 / 1191 / 501
Регистрация: 14.10.2018
Сообщений: 3,211
10.09.2020, 14:19
Цитата Сообщение от FaceHoof Посмотреть сообщение
Я эту задачу решил
Можно глянуть ваше решение? Возможно это поможет в решении задачи.
0
113 / 100 / 68
Регистрация: 21.04.2014
Сообщений: 1,420
11.09.2020, 08:46  [ТС]
Ого, не ожидал такого консилиума

Прошу прощение, что стольких людей на это отвлёк, но, к сожалению, должен сообщить, что задача изначально была сформирована не совсем верно. Оказывается метод GetNumber по сути строит какую-то параболу. И делает это не самым очевидным образом: В большинстве случаев первое переданное значение становится наименьшей точкой (на рисунке точка А). Но иногда по каким-то причинам это сделать невозможно и тогда первое переданное значение становится другой точкой (на пример точкой В). Как именно выбирается где будет эта другая точка, установить пока что не удалось. Ну и следовательно условие, что если полученное значение стало уменьшаться, то дальше расти оно не будет - не всегда верно, ведь мы можем начать в точке В. Ну а задача сводится к определению максимального передаваемого значения при котором одна из ветвей параболы достигает максимального значения (предполагается, что парабола ограничена сверху).
Миниатюры
Записать в один цикл  
0
Модератор
Эксперт .NET
 Аватар для Элд Хасп
16140 / 11264 / 2888
Регистрация: 21.04.2018
Сообщений: 33,109
Записей в блоге: 2
11.09.2020, 11:09
Цитата Сообщение от FaceHoof Посмотреть сообщение
задача сводится к определению максимального передаваемого значения при котором одна из ветвей параболы достигает максимального значения (предполагается, что парабола ограничена сверху).
Понятнее не стало...
Если это ПАРАБОЛА, то у неё нет МАКСИМУМА, есть только минимум - это точка А на вашем рисунке.
Если же есть на ветвях перегибы в обратную сторону, то это уже не парабола.

Как решать в общем виде по неизвестной функции... даже предположить не могу.
Нужно уточнить характер функции.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
11.09.2020, 11:09
Помогаю со студенческими работами здесь

Заменить цикл на один запрос
Добрый день первый раз на этой ветке и вчера принялся за изучение LINQ) Сразу куча вопросов. Сейчас вот пытаюсь перестроиться с циклов на...

Цикл выполняется один раз
Здравствуйте! Помогите, пожалуйста с задачей. Пусть а=а=1. а = а + а/2к-1 где к=2,3...Посчитать произведение а0*а1*…*а пока...

Вычислить, используя один цикл
Вычислить, используя один цикл: S=\sum_{i=1}^{8}i^2+\sum_{i=4}^{25}i+\sum_{i=16}^{49}\sqrt{i}

Создать программу по всем 3 видам циклов...цикл с параметром,цикл с условием,цикл,и цикл с предусловием...
Найти сумму чисел 1 в квадрате до 10 c квадрате...операцию возведению в степень не использовать учесть особенности получения квадратного...

Записать как цикл
Здравствуйте! Скажите есть решение проблемы. Я копирую запись из одной таблицы в другую, но капируется только выделенная. а как записать...


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru