дружественные числа
|
|
ymatem | Дата: Четверг, 10.01.2008, 01:03 | Сообщение # 1 |
Знакомый
Группа: Пользователи
Сообщений: 13
Статус: Offline
| я только начала разбираться в паскале и в общем набрела на такую задачу: "найти все дружественные числа в интервале от 1 до 300. Два числа называются дружественными, если каждое из них равно сумме делителей другого числа (включая 1 и исключая само число). Например: 220 и 284 220: 1+2+4+5+10+11+20+22+44+55+110=284 284: 1+2+4+71+142=220." когда я пыталась ее решить, то одинаковые числа не рассматривала. вот что я накалякала var a,b,k,s,m,d:integer; begin k:=0; s:=0; d:=0; m:=0; For b:=1 to 220 do for a:=(b+1) to 300 do begin repeat k:=k+1; if a mod k = 0 then s:=s+k; until k <> a div 2; if b=s then repeat d:=d+1; if b mod d = 0 then m:=m+d; until d <> b div 2; if b=s then if a=m then writeln(a,' ',b) end; end. но компьютер не перебирает все числа, он останавливается, типа сил у него не хватает. Пожалуйста, подскажите в чем у меня ошибка или как по другому решить задачу. Заранее спасибо.
|
|
| |
Alexander | Дата: Вторник, 08.04.2008, 06:13 | Сообщение # 2 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Я не анализировал ваш код, но мне показалось, что вы мыслите в другом направлении. Задачка-то элементарна: 1)Берёте каждое число из интервала. 2)находите сумму всех его делителей. 3)Проверяете попала ли сумма в интервал. 3а) Если попала, то выводите на экран число и сумму делителей 4)Берёте следующее число и переходите на шаг 2, пока числа не кончатся. Пишите, если ещё что-то не ясно.
Скажем дружно- нафиг нужно!
|
|
| |
Pavel | Дата: Вторник, 08.04.2008, 11:15 | Сообщение # 3 |
Приближенный
Группа: Модераторы
Сообщений: 210
Статус: Offline
| Кстати, промежуток проверки можно сузить. Для четных чисел в два раза, а для нечетных в три раза. Думаю, понятно почему.
|
|
| |
Alexander | Дата: Вторник, 08.04.2008, 16:35 | Сообщение # 4 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote Для четных чисел в два раза, а для нечетных в три раза. Вы что, из математиков??? Это они любят говорить фразы, которые потом по пол дня додумывать надо . Поэтому просто сравниваем до квадратного корня и всё.
Скажем дружно- нафиг нужно!
|
|
| |
Pavel | Дата: Вторник, 08.04.2008, 17:10 | Сообщение # 5 |
Приближенный
Группа: Модераторы
Сообщений: 210
Статус: Offline
| Нет мы не из математиков. Вот напрмер: 8 кратно 4, 4 - половина. А вот 8 на 5 не коратно. Так что смысла дальше перебирать нет. А насчет корня как вариант, но для не для нечетных чисел. Можешь сам, Alexander, проверить!
|
|
| |
Alexander | Дата: Среда, 09.04.2008, 03:39 | Сообщение # 6 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Ой, да. Корень это из другой оперы. Я просто другу вчера курсовую на Сях дописывал, там была небольшая загвоздка с корнем, вот я его и леплю везде . Но проверять число на чётность не рационально. Если б у нас были числа по 60-70 знаков, то да, а в паскале нет встроенной поддержки таких чисел, поэтому проверка на чётность будет есть столько же ресурсов, сколько и сам перебор.
Скажем дружно- нафиг нужно!
|
|
| |
Pavel | Дата: Среда, 09.04.2008, 13:57 | Сообщение # 7 |
Приближенный
Группа: Модераторы
Сообщений: 210
Статус: Offline
| Quote нет встроенной поддержки таких чисел как так нет? odd() - вот она! Стоит в начале сделать проверку и все.
|
|
| |
Alexander | Дата: Среда, 09.04.2008, 16:34 | Сообщение # 8 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote как так нет? odd() - вот она! O_o, а я думал odd только проверяет на число на нечётность . Ну раз поддержка таких чисел есть, то продемонстрируйте на простеньком примере(посчитать 10^(40)+1). А по поводу быстродействия решим вечером, надо посмотреть под отладчиком генерируемый код и всё станет ясно .
Скажем дружно- нафиг нужно!
|
|
| |
Pavel | Дата: Среда, 23.04.2008, 16:19 | Сообщение # 9 |
Приближенный
Группа: Модераторы
Сообщений: 210
Статус: Offline
| Quote (Alexander) Ну раз поддержка таких чисел есть, то продемонстрируйте на простеньком примере(посчитать 10^(40)+1). Во первых, если вычислить это выражение и если оно не будет больше типа, указанного типа во входящем параметры процедуры, то посчитает. И вот еще: функция эта дает булевский результат, т.е. если нечетное число, то True, если наоборот, то False. Что ж тут неясного-то.
|
|
| |
Alexander | Дата: Среда, 23.04.2008, 18:24 | Сообщение # 10 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote если оно не будет больше типа, указанного типа во входящем параметры процедуры без "если". В паскале поддерживаются числа до 2^(32)-1, а тут 10^(40), разве не очевидно . Quote Что ж тут неясного-то. А неясно было, сколько тактов уйдёт на вызов и отработку функции odd, а сколько на виток цикла. У меня вышло 16 на odd и примерно 8 на виток цикла.... Поэтому проверить на чётность всё-таки стоит, а я этого раньше не делал .
Скажем дружно- нафиг нужно!
|
|
| |
Pavel | Дата: Четверг, 24.04.2008, 08:22 | Сообщение # 11 |
Приближенный
Группа: Модераторы
Сообщений: 210
Статус: Offline
| Quote (Alexander) А неясно было, сколько тактов уйдёт на вызов и отработку функции odd, а сколько на виток цикла. У меня вышло 16 на odd и примерно 8 на виток цикла.... Поэтому проверить на чётность всё-таки стоит, а я этого раньше не делал про такты я ничего не слыхал от тебя! в прошлом посте. Quote (Alexander) ез "если". В паскале поддерживаются числа до 2^(32)-1, а тут 10^(40), разве не очевидно в плане этого, я могу сказать, что даже не собирался считать. Хоть это и очевидно. Посмотрев на число я и сказал, что функцию ограничивает (и Паскаль) ограниченность типов данных. По поводу производительности: odd мы проверяем до цикла, и вот если честно, на наших компах вывод даже одной строки будет медленнее, чем вся эта программа. Я вот хочу поставить эмулятор 286 и пробовать свои проги (по чмсленным методам), так они нуждаются в оптимизации больше всех.
|
|
| |
Alexander | Дата: Четверг, 24.04.2008, 09:17 | Сообщение # 12 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Quote про такты я ничего не слыхал от тебя! в прошлом посте. Смотри раньше: Quote бла-бла-бла... поэтому проверка на чётность будет есть столько же ресурсов, сколько и сам перебор. Quote odd мы проверяем до цикла . Хочу посмотреть на того, кто проверит уже после начала цикла . Хотя сам видел в кодах такие перлы... Правда всё на сях, т.к. он для меня родной: Code for(int i=0;i<k;i++) { .... if( f(x) ) { break; break; break; } } На вопрос "а зачем три раза?" был получен гениальный ответ: "А чтоб наверняка!".
Скажем дружно- нафиг нужно!
|
|
| |
Pavel | Дата: Четверг, 24.04.2008, 18:24 | Сообщение # 13 |
Приближенный
Группа: Модераторы
Сообщений: 210
Статус: Offline
| Quote (Alexander) На вопрос "а зачем три раза?" был получен гениальный ответ: "А чтоб наверняка!". Ну блин! Я видел: Code if true = false then exit; Ксожалению того человека, кто это написал не видел.
|
|
| |
Alexander | Дата: Четверг, 24.04.2008, 18:31 | Сообщение # 14 |
Всевышний
Группа: Модераторы
Сообщений: 475
Статус: Offline
| Ну это всё безобидные ошибки. Я по сети знаю одного кадра, который при очищении временного каталога, проверял только не называется ли файл ".", а ".." не проверял. Винда в тот день больше не запускалась
Скажем дружно- нафиг нужно!
|
|
| |
М@РИНКА | Дата: Пятница, 02.05.2008, 01:13 | Сообщение # 15 |
Новичок
Группа: Пользователи
Сообщений: 1
Статус: Offline
| Помогите, являються ли x и e дружествами? спасибо заранее)))
|
|
| |