| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Центр помощи > [Pascal] Поиск пифагоровых чисел |
| Автор: Tauros 12.10.2006, 18:00 |
| Нужно сделать задание на паскале: " Спроектировать алгоритм по нисходящей схеме с использованием базовых управляющих структур для задачи: Найти все пифагоровы числа на заданном интервале [n,m]. Пифагоровы числа удовлетворяют условию a*a+b*b=c*c " |
| Автор: Sartorius 12.10.2006, 18:08 | ||
страшно звучит Перебирай просто все троики из интервала.... |
| Автор: Kuvaldis 13.10.2006, 12:12 | ||||||
Sartorius,
Это не рационально. оптимизированный вариант Для начала немного математики пусть нас интересует интервал [n, m] и числа a, b, с на нем Причем в поиске a <= b (ищем тройки с точностью до слагаемых) Очевидно, что минимально возможным значением для с в этой ситуации будет sqrt(n^2 + n^2) = n * sqrt(2) так как с^2 = a^2 + b^2. Минимальное a = миниальное b = n Поэтому переменную c для прокрутки в цикле инициализируем так
ТАк как решили искать с точностью до слагаемых, то a <= b. Значит, a^2 <= b^2 Значит, 2 * a^2 <= c^2 Значит, a <= с /sqrt(2)
|
| Автор: Sartorius 13.10.2006, 12:36 |
| Kuvaldis, простой перебор имеет трудоемкость |n-m|**3 ... Твой алгоритм дает немного меньше 1/4*|n-m|**3 ИМХО не очень большой выигрыш... Хотя если интервал достаточно большой, а машина медленная , то и такое может пригодиться... |
| Автор: MBo 13.10.2006, 12:45 |
| все тройки a,b,c генерируются, например, методом древних греков: u^2-v^2, 2uv, u^2+v^2 u>v (лучше взаимно простые числа брать для получения базовых троек (типа 3,4,5), а производные тройки (9,12,15) получать умножением) |
| Автор: Kuvaldis 13.10.2006, 12:46 |
| Sartorius, А есть ли кардинально лучший и эффективный алгоритм? To MBo: одновременно сообщения отправили. |
| Автор: Sartorius 13.10.2006, 12:54 |
| Kuvaldis, да вот в том что предложил MBo что то есть... тока нада задать границы для u и v прально... и построить таблицу простых чисел в этом интервале |
| Автор: MBo 13.10.2006, 12:57 |
| Sartorius, >и построить таблицу простых чисел в этом интервале не простых, а взаимно простых (разной четности, не делящихся одновременно на 3 и т.д.) |
| Автор: Tauros 14.10.2006, 14:29 | ||
| Kuvaldis, спасибо за программу, но если вводить отрицательные значения то выдает "Error 207 Invalid floating point operation" , курсор после строки
также вроде ошибка появляется если ввести значение верхней границы больше 150 или около того. Для больших значений честно говоря не очень то важно, а вот ошибку с отрицательными лучше бы исправить |
| Автор: Kuvaldis 14.10.2006, 15:09 | ||||
Tauros,
Проблема из-за того, что я по умолчанию для вывода цифр каждой тройки отвел 3 позиции. После 150 они сливаются. Лечится элементарно
А про отрицательные числа никто не говорил. Лан, сейчас посмотрю Надеюсь, ты не собираешься вводить границы разных знаков: нижняя - отрицательная, верхняя - положительная??? |
| Автор: Kuvaldis 14.10.2006, 15:25 | ||||
Скорректированный вариант
Какая ошибка? Как получил? |
| Автор: Tauros 14.10.2006, 15:32 |
| теперь работают отрицательные интервалы, но в ответе все равно числа положительные... ясное дело что там квадрат и разницы никакой... но все же.... ошибка при верхнем интервале большем 181 та же самая - 207 p.s. а почему не работает интервал от отрицательного до положительного??? |
| Автор: Kuvaldis 14.10.2006, 15:35 | ||||
Tauros,
Это маленькая опечатка. Можешь исправить сам.
Это сделать чуть-чуть сложнее. Я ж у тебя и спросил: это надо или нет? |
| Автор: Tauros 14.10.2006, 15:37 | ||
угу... может и могу, но не знаю где
и намного это будет сложнее??? если тебе не трудно и не влом, то напиши но мне кажется что и такая программа прокатит |
| Автор: Kuvaldis 14.10.2006, 15:38 |
| Со знаком поправил, см. предыдущий пост |
| Автор: Tauros 14.10.2006, 15:47 |
| после значения верхней границы 181 выдает ошибку 207 (ту же самую) |
| Автор: Kuvaldis 14.10.2006, 15:50 |
| Tauros, Понял!!! Ты ж пишешь в паскале (я тестил в консольке Delphi). А какое максимально допустимое значение для типа integer в паскале?? Правильно: 32767 (2 байтовое знаковое число). Поэтому так и работает. Чтобы исправить, замени все переменные типа integer на longint |
| Автор: Tauros 14.10.2006, 16:00 |
| Kuvaldis, действительно помогло!!!!!! а что насчет разных знаков интервала???? очень много менять придется? |
| Автор: Kuvaldis 14.10.2006, 16:15 | ||
| Tauros, ну, ты душу всю вынешь. Добавилась процедура, которая проверяет все возможные комбинации из 3 чисел (их 8) на попадание в заданный интервал. Если попадает, то выводим P.S. int на longint сам замени. Мне лень.
|
| Автор: Tauros 14.10.2006, 16:18 |
| Kuvaldis, дааа ))) мягко говоря потруднее стало )))) Спасибо большое за помощь!!! ))) p.s. ты в код еще какую то программу засунул!!! )))) |
| Автор: Kuvaldis 14.10.2006, 16:27 | ||
| Tauros, 1.Надеюсь, теперь ты удовлетворен? 2.
Основная программа осталась без изменений почти. Мы корректируем отрезок из положительных (!) чисел для поиска. Если одно число < 0, а другое > 0, то ищем все варианты на отрезке 0 .. max(m0, n0). Ищем неотрицательные тройки. Потом вызываем процедуру, которая перебирает все возможные варианты троек (когда а, b, c +/-) и проверяет попадают ли эти числа в заданный интервал. Если да, то вывод |
| Автор: Tauros 16.10.2006, 16:00 |
| Kuvaldis, может и не рационально, но преподша сказала , про тот вариант что я показал (твой), цитирую: "Зачем так сложно?... Что это? я это не понимаю.... давай, я этого не видела, переделай..." и еще оказалось что пофиг на то положительные числа или отрицательные |