Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.80/5: Рейтинг темы: голосов - 5, средняя оценка - 4.80
60 / 17 / 11
Регистрация: 01.11.2014
Сообщений: 100

Неясность в простейшем цикле

02.12.2014, 18:52. Показов 1103. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго! То ли лыжи не едут, то ли коэффициент трения зашкаливает: подсмотрел я у Шилдта код, ищущий максимальный и минимальный делитель введенного числа, переделал его только под поиск только максимального значения. Казалось, ничего сложного, все работает, но не могу понять зачем тут условие if (div==1). Если без него - возвращается минимальное значение. Очевидно, конечно, что влияние этого условия серьезное, но как это работает - хоть убей, не пойму. Буду весьма благодарен за пояснение!

C#
1
2
3
4
5
6
7
8
int x = int.Parse(Console.ReadLine());
int div = 1;
            for (int i = x / 2; i >= 2; i--)
            {
                if ((div == 1)&(x % i == 0))
                    div = i;
            }
            Console.WriteLine(div);
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.12.2014, 18:52
Ответы с готовыми решениями:

Умудрился запутаться в простейшем цикле
Нужно сделать программу для табулирования функции(Два списка со значениями x и соответствующими им значениям y. Вводятся начальное значение...

Неясность с бэками
Привет всем. Поставьте диагноз. Есть конкурирующий ресурс, по Яше на него ссылается 140 сайтов, а страниц порядка 30000, тИЦ...

неясность с синтаксисом
Здравствуйте! При разборе примера столкнулась с непониманием, как работает метод. В данном коде проверяется достигнут ли конец строки, не...

6
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.12.2014, 18:58
Лучший ответ Сообщение было отмечено msg_kurt как решение

Решение

Цитата Сообщение от msg_kurt Посмотреть сообщение
как это работает - хоть убей, не пойму.
Посмотрите внимательнее на код: в каких случаях div будет равен единице?
Ровно в двух: ему еще не присвоено значение или i == 1 (то есть число х простое).
Если хотя бы один раз условие пройдет, то div станет равно i, то есть уже не единице, следовательно условие больше выполняться не будет до конца цикла.
В результате, кстати, получается много бестолковых операций по поиску того, что уже нашли.
0
60 / 17 / 11
Регистрация: 01.11.2014
Сообщений: 100
02.12.2014, 19:47  [ТС]
kolorotur, просто и доступно, спасибо.
Цитата Сообщение от kolorotur Посмотреть сообщение
В результате, кстати, получается много бестолковых операций по поиску того, что уже нашли.
Лишние итерации, или я опять на лыжи стал?=)
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.12.2014, 20:10
Цитата Сообщение от msg_kurt Посмотреть сообщение
Лишние итерации
Ага, они самые.
Если наибольший делитель числа 800 равен 400 и находится на первой же итерации, то зачем выполнять цикл до единицы?
1
60 / 17 / 11
Регистрация: 01.11.2014
Сообщений: 100
02.12.2014, 20:24  [ТС]
kolorotur, я так понимаю, цикл надо прервать:
C#
1
2
3
4
5
6
7
 for (int i = x/2; i>=2; i--)
            {
                if ((div == 1) & (x % i == 0))
                    div = i;
                if (div >1) break;
 
            }
но вот корректно ли я это делаю? Или можно посимпатичней сделать?
0
Эксперт .NET
 Аватар для kolorotur
17823 / 12973 / 3382
Регистрация: 17.09.2011
Сообщений: 21,261
02.12.2014, 21:58
Цитата Сообщение от msg_kurt Посмотреть сообщение
но вот корректно ли я это делаю?
Ну как... код работает? Ответ выдает верный? Значит корректно.
Остальное — вопрос производительности и эстетики.

Цитата Сообщение от msg_kurt Посмотреть сообщение
Или можно посимпатичней сделать?
Если рассматривать конкретно этот подход, то лучше конечно весь код вынести в отдельный метод и возвращать найденное значение прямиком из цикла.
Тогда и переменная div, кстати, не понадобится.

Если рассматривать сам алгоритм, то конечно он не оптимален, т.к. идет перебор всех чисел.
Можно перебор заменить на такой подход:
1. Если известен наименьший делитель, то наибольший делитель (если не считать само число) получается путем деления числа на наименьший делитель.
2. Наименьший делитель (если не считать единицу) всегда будет простым числом.
3. Если имеется отсортированный по возрастанию список простых чисел, то достаточно идти по нему, пока не найдется первое значение, которое является делителем числа — это и будет наименьший делитель.
1
60 / 17 / 11
Регистрация: 01.11.2014
Сообщений: 100
02.12.2014, 22:57  [ТС]
kolorotur, спасибо огромное еще раз, камрад! Понесла меня теперь нелегкая в решетки Аткина, Эратосфена и Сундарама=)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
02.12.2014, 22:57
Помогаю со студенческими работами здесь

Неясность с strtok
Здравствуйте, возникла проблема с использованием функции strtok. Есть следующее: AnsiString Line; Line =...

Неясность в процедуре
Товарищи у меня вопросик по процедуре: Ниже приведенные две проц-ры я создал и прописал сразу после implementation ($R, *.dfm)...

Неясность в размерности
Подскажите пожалуйста с размерностями для сущностей, которые связаны с Schedule. НУ если есть ошибка где-то еще поправьте.

Глюк в простейшем скрипте
Приветствую всех. Нахожусь в лёгком замешательстве %-). Вроде простой скрипт выпадающего списка месяцев года. Идея в том, чтобы в значениях...

Ошибка в простейшем коде
SELECT name as id_d FROM dolz UNION ALL SELECT name as id_o FROM otdel собственно хочу объединить два столбца в одну таблицу, но...


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

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера 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. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru