![]() |
|
Модераторы: Poseidon |
![]()
|
|
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Нужно сделать задание на паскале:
" Спроектировать алгоритм по нисходящей схеме с использованием базовых управляющих структур для задачи: Найти все пифагоровы числа на заданном интервале [n,m]. Пифагоровы числа удовлетворяют условию a*a+b*b=c*c " |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
страшно звучит Перебирай просто все троики из интервала.... |
|||
|
||||
| Kuvaldis |
|
||||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
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)
Это сообщение отредактировал(а) Kuvaldis - 13.10.2006, 12:31 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||||
|
|||||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Kuvaldis, простой перебор имеет трудоемкость |n-m|**3 ... Твой алгоритм дает немного меньше 1/4*|n-m|**3 ИМХО не очень большой выигрыш... Хотя если интервал достаточно большой, а машина медленная , то и такое может пригодиться...
|
|||
|
||||
| MBo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 7 Всего: 18 |
все тройки a,b,c генерируются, например, методом древних греков:
u^2-v^2, 2uv, u^2+v^2 u>v (лучше взаимно простые числа брать для получения базовых троек (типа 3,4,5), а производные тройки (9,12,15) получать умножением) |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Sartorius,
А есть ли кардинально лучший и эффективный алгоритм? To MBo: одновременно сообщения отправили. Это сообщение отредактировал(а) Kuvaldis - 13.10.2006, 12:54 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Sartorius |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1568 Регистрация: 18.7.2006 Где: Ivory tower Репутация: 8 Всего: 37 |
Kuvaldis, да вот в том что предложил MBo что то есть... тока нада задать границы для u и v прально... и построить таблицу простых чисел в этом интервале |
|||
|
||||
| MBo |
|
|||
|
Бывалый ![]() Профиль Группа: Участник Сообщений: 234 Регистрация: 10.6.2002 Репутация: 7 Всего: 18 |
Sartorius,
>и построить таблицу простых чисел в этом интервале не простых, а взаимно простых (разной четности, не делящихся одновременно на 3 и т.д.) |
|||
|
||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Kuvaldis,
спасибо за программу, но если вводить отрицательные значения то выдает "Error 207 Invalid floating point operation" , курсор после строки
также вроде ошибка появляется если ввести значение верхней границы больше 150 или около того. Для больших значений честно говоря не очень то важно, а вот ошибку с отрицательными лучше бы исправить Это сообщение отредактировал(а) Tauros - 14.10.2006, 14:57 |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Tauros,
Проблема из-за того, что я по умолчанию для вывода цифр каждой тройки отвел 3 позиции. После 150 они сливаются. Лечится элементарно
А про отрицательные числа никто не говорил. Лан, сейчас посмотрю Надеюсь, ты не собираешься вводить границы разных знаков: нижняя - отрицательная, верхняя - положительная??? Это сообщение отредактировал(а) Kuvaldis - 14.10.2006, 15:20 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Kuvaldis,
нет, так не получается, все равно та же ошибка, кстати я проверил, нормально считает до 181 включительно т.е. рассчитывает максимум 291 троек, а ошибка потом...
ну так я пробовал вводить... но даже если вводить обе границы отрицательными все равно ошибка!!! Программа находит 3 тройки среди которых есть ПОЛОЖИТЕЛЬНЫЕ и 0 b, хотя интервал отрицательный, а потом ошибка Это сообщение отредактировал(а) Tauros - 14.10.2006, 15:26 |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Скорректированный вариант
Какая ошибка? Как получил? Это сообщение отредактировал(а) Kuvaldis - 14.10.2006, 15:37 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
теперь работают отрицательные интервалы, но в ответе все равно числа положительные... ясное дело что там квадрат и разницы никакой... но все же....
ошибка при верхнем интервале большем 181 та же самая - 207 p.s. а почему не работает интервал от отрицательного до положительного??? Это сообщение отредактировал(а) Tauros - 14.10.2006, 15:35 |
|||
|
||||
| Kuvaldis |
|
||||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Tauros,
Это маленькая опечатка. Можешь исправить сам.
Это сделать чуть-чуть сложнее. Я ж у тебя и спросил: это надо или нет? -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
||||
|
|||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
угу... может и могу, но не знаю где
и намного это будет сложнее??? если тебе не трудно и не влом, то напиши но мне кажется что и такая программа прокатит Это сообщение отредактировал(а) Tauros - 14.10.2006, 15:39 |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Со знаком поправил, см. предыдущий пост
-------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
после значения верхней границы 181 выдает ошибку 207 (ту же самую)
|
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Tauros,
Понял!!! Ты ж пишешь в паскале (я тестил в консольке Delphi). А какое максимально допустимое значение для типа integer в паскале?? Правильно: 32767 (2 байтовое знаковое число). Поэтому так и работает. Чтобы исправить, замени все переменные типа integer на longint Это сообщение отредактировал(а) Kuvaldis - 14.10.2006, 15:50 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Kuvaldis,
действительно помогло!!!!!! а что насчет разных знаков интервала???? очень много менять придется? |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Tauros,
ну, ты душу всю вынешь. Добавилась процедура, которая проверяет все возможные комбинации из 3 чисел (их 8) на попадание в заданный интервал. Если попадает, то выводим P.S. int на longint сам замени. Мне лень.
Это сообщение отредактировал(а) Kuvaldis - 14.10.2006, 16:21 -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Kuvaldis,
дааа ))) мягко говоря потруднее стало )))) Спасибо большое за помощь!!! ))) p.s. ты в код еще какую то программу засунул!!! )))) |
|||
|
||||
| Kuvaldis |
|
|||
![]() механик-вредитель ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 1189 Регистрация: 16.6.2006 Где: Минск Репутация: 32 Всего: 61 |
Tauros,
1.Надеюсь, теперь ты удовлетворен? 2.
Основная программа осталась без изменений почти. Мы корректируем отрезок из положительных (!) чисел для поиска. Если одно число < 0, а другое > 0, то ищем все варианты на отрезке 0 .. max(m0, n0). Ищем неотрицательные тройки. Потом вызываем процедуру, которая перебирает все возможные варианты троек (когда а, b, c +/-) и проверяет попадают ли эти числа в заданный интервал. Если да, то вывод -------------------- Помни - когда ты спишь, враг не дремлет Спи чаще и дольше, изматывай врага бессоницей |
|||
|
||||
| Tauros |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 31 Регистрация: 24.9.2006 Репутация: нет Всего: нет |
Kuvaldis,
может и не рационально, но преподша сказала , про тот вариант что я показал (твой), цитирую: "Зачем так сложно?... Что это? я это не понимаю.... давай, я этого не видела, переделай..." и еще оказалось что пофиг на то положительные числа или отрицательные Это сообщение отредактировал(а) Tauros - 16.10.2006, 16:12 |
|||
|
||||
![]()
|
| Правила форума "Центр помощи" | |
|
|
ВНИМАНИЕ! Прежде чем создавать темы, или писать сообщения в данный раздел, ознакомьтесь, пожалуйста, с Правилами форума и конкретно этого раздела.
Более подробно с правилами данного раздела Вы можете ознакомится в этой теме. Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Poseidon, Rodman |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Центр помощи | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |