|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
24.09.2012, 22:10 | #1 |
Новичок
Джуниор
Регистрация: 24.09.2012
Сообщений: 1
|
задачи с перебором условий или без?
помогите решить две задачи:
1.Задано целое положительное число >=1. Вывести на экран все его полож. делители 2.Задана последовательность чисел 1,1+1/2,1+1/2+1/3, ... Найти первый её элемент, который больше числа а, ввод. с клавиатуры. |
24.09.2012, 22:29 | #2 |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
И где здрасте?
Тут не онлайн решатель задач, а живые люди от которых возможно зависит Ваше дальнейшее образование. Где наработки? №1 В чем сложность? Берем и решаем в лоб, от 1 до n, if n mod i = o then WriteLn (i); Если Вы более менее математик, то берем и решает по теореме (название не помню), всё так же, но проверяем до (корня из числа n) - 1 (не забудь Trunc при присваивании), и так же выводим только и i, и n div i; после for не забываем развилочку с проверкой на делимость корня. И профит № 2 а тут вообще без премудростей, вообщем или с наработками или с денюжкой во фриланс. |
25.09.2012, 06:00 | #3 | |
Форумчанин
Регистрация: 05.09.2011
Сообщений: 869
|
хехе, и где же ты видел, штоб князья здоровкались? ))
Цитата:
Зачем вычитать 1? я бы лучше прибавил, если уж ты используешь Trunc.. )) И что за развилка? делимость корня на что?..
Предпочитаю на "ты".
|
|
25.09.2012, 15:33 | #4 | ||
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
Цитата:
Цитата:
Код:
UPD Забыл про пробельчики Неа, не помню я название теоремы, завтра у преподавателя спрошу. (может вообще не теорема)... Последний раз редактировалось Poma][a; 25.09.2012 в 21:36. |
||
26.09.2012, 04:25 | #5 |
Форумчанин
Регистрация: 05.09.2011
Сообщений: 869
|
Ром, но зачем? Почему ты вынес то, что должно было быть последним оборотом цикла, ЗА пределы цикла и выполнил отдельно? Промотивируй.
Теперь по поводу Trunc.. Квадратный корень - функция действительного типа, считается на компьютере с некоторой точностью. Что это значит? Что результат вычисления, например, Sqrt(4) может быть равен 2, а может 1.999999999999. При этом, второе число ДОЛЖНО считаться ПРАВИЛЬНЫМ. Почему? Потому что, если точность вычислений равна d, то два числа, отличающиеся меньше, чем на d, ДОЛЖНЫ считаться РАВНЫМИ. Это - смысл концепции ТОЧНОСТЬ ВЫЧИСЛЕНИЙ. Без понимания этого разговоры про точность - пустой звук. Далее. Если в некоторый момент ты получаешь, например, Sqrt(100000000) равным не 10000, как ожидается, а 9999.9999999 (и этот результат, повторюсь, ПРАВИЛЬНЫЙ), то что произойдет? Trunc тупо отбросит дробную часть, и конечный результат будет меньше нужного аж на 1!! И вот тогда you're in trouble.. Чтоб этого не случилось, рекомендую сделать одно из двух: 1. либо делать цикл не до scrt(n)-1, и даже не до sqrt(n), а до sqrt(n)+1. При этом ты, возможно (и даже скорее всего), сделаешь лишнюю работу, но зато не пропустишь верный результат. 2. либо вместо Trunc делать тривиальный Round. Он преобразует число к ближайшему целому. Да, ты снова будешь делать лишнюю работу, но меньше, чем в предыдущем случае (примерно вдвое). Есть еще и третий способ, на самом деле, и он лучше (ээ.. эффективнее) этих двух, но он некоторым боком завязан на точность вычислений, что мне не импонирует, хотя это проблема разрешимая. Допустим, ты используешь тип real, точность которого 10^-12 (примерно). Далее, твой целый тип достигает только (условно) 10000, а корень из него не более всего лишь 100. Значит, ошибка при вычислении корня будет порядка 10^-10. Для уверенности продвинем ее до 10^-9. И теперь мы ведем цикл до Trunc(Sqrt(n)+10^-9). Что мы получим? да, мы по-прежнему будем делать ИНОГДА лишнюю работу, но НАМНОГО реже, чем в первом случае или даже во втором. Причем, если мы не уверены, какая реальная точность вычислений, мы можем загрубить эту добавку - сделать ее 10^-8, or 10^-7, or even 10^-5 at last!.. There still will be NO MISTAKE in our calculations - just little bit of extra job done. Я понятно выразился? )
Предпочитаю на "ты".
|
26.09.2012, 07:44 | #6 | ||
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
Так : давайте по порядку.
1) Цитата:
Код:
2) Про Trunc. Разговор пока отложим. Я пойду почитаю про Цитата:
|
||
26.09.2012, 11:06 | #7 | |
Форумчанин
Регистрация: 05.09.2011
Сообщений: 869
|
Цитата:
Однако... упс!! ))) По мере разбирательства с тобой, заметил ошибку у себя.. Я как-то молчаливо согласился с тобой, что перебор надо делать до корня из n - а это же неправильно! Перебор для отыскания ВСЕХ делителей нужно, конечно же, делать до n пополам.. Код:
Да - так какая там теорема-то? не вспомнил? ))
Предпочитаю на "ты".
|
|
26.09.2012, 11:27 | #8 |
Старожил
Регистрация: 08.02.2012
Сообщений: 2,173
|
Касательно точности вычислений - зачем в for упираться рогами если это решается по-другому:
Код:
Правильно поставленная задача - три четверти решения.
|
26.09.2012, 15:32 | #9 | |
Новичок
Джуниор
Регистрация: 11.10.2011
Сообщений: 3,882
|
программа без развилки, до sqrt(n) при аргументе 4, выдаст
Код:
Код:
Теперь возьмем аргумент 100, если в цикле n div 2, то работаем да 50, если sqrt(n)-1 то до 10. Вот нашел подтверждение http://www.programmersforum.ru/showp...9&postcount=20 Сама тема : http://www.programmersforum.ru/showthread.php?t=119883 Цитата:
Был я у учителя, узнал, что на самом деле теоремы никакой нет, Sqrt получен путем размышлений и только. Про Trunc, он полностью подтвердил слова TinMan'a. (кстати во избежание всяких иллюзий, сомнений в словах TinMan'a в жизни не было) приведу пример для делителей 20, ответы : Код:
Тоесть где должна находиться "черта", примерно на квадратном корне. Маленький итог на данном этапе : 1) Trunc однозначно убрать 2) Получить максимальное(по возможности) быстродействие. (но пока без замены на 3 пункт решения предложенного TinMan'ом) 3) И наверное отбросить развилочку (я в своё время сдавал преподавателю, так как он просил => с развилкой) Последний раз редактировалось Poma][a; 26.09.2012 в 23:25. |
|
27.09.2012, 04:25 | #10 |
Форумчанин
Регистрация: 05.09.2011
Сообщений: 869
|
LOL )))
Ромаха, я твой должник ). Сейчас попробую прибавить репу.. Сегодня проснулся и в тот же момент понял, как прозрел )). Понял, во что я не врубался так долго.. Ты же выдаешь ДВА числа! я понимаю, что это ОЧЕНЬ просто и тривиально, но вот - барьер какой-то был.. (( мож, грипп мешал, зараза - сегодня первый день без температуры.. Кароч, не буду многословным - Ром, ты прав во всем, все мои слова беру обратно, они сказаны не на тот предмет. Единственное, что можно добавить - все же хотелось бы видеть результат упорядоченным (хотя этого нет в условии задачи, согласен). Думаю, проще всего одно число (меньшее) выводить, а вторые (большие) - накапливать (например, в списке). Затем накопленные вывести в обратном порядке. Тогда не потребуется собственно упорядочивания. Ромаха, еще раз спасибо за науку! )
Предпочитаю на "ты".
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Моделирование условий сделок (Mathlab, VBA, C++ или другое) | Northid | Фриланс | 2 | 14.06.2012 17:53 |
Виды (или типы) условий (оч важно, скоро сдача!) | MisterMaster | Помощь студентам | 2 | 16.02.2012 20:01 |
Экономия памяти. Что лучше: метод класса или процедура с параметрами... или без разницы? | 3D Hunter | Общие вопросы Delphi | 7 | 26.12.2011 23:23 |
Вложенные функции или слишком много условий | OgE®_M@G | Microsoft Office Excel | 4 | 03.11.2011 07:35 |
Сравнить два числа без условий и стандартными операциями | fastdeath | Паскаль, Turbo Pascal, PascalABC.NET | 17 | 21.10.2011 10:40 |