Четверг, 09.01.2025
Pascal 4 All
[ · Новые сообщения · Участники · Правила форума · Поиск · RSS ]

 

  • Страница 1 из 2
  • 1
  • 2
  • »
Модератор форума: Seqular, Pavel  

дружественные числа
ymatemДата: Четверг, 10.01.2008, 01:03 | Сообщение # 1
Знакомый
Группа: Пользователи
Сообщений: 13
Репутация: 2
Замечания: 0%
Статус: 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
Репутация: 16
Замечания: 0%
Статус: Offline
Я не анализировал ваш код, но мне показалось, что вы мыслите в другом направлении. Задачка-то элементарна:
1)Берёте каждое число из интервала.
2)находите сумму всех его делителей.
3)Проверяете попала ли сумма в интервал.
3а) Если попала, то выводите на экран число и сумму делителей
4)Берёте следующее число и переходите на шаг 2, пока числа не кончатся.
Пишите, если ещё что-то не ясно.


Скажем дружно- нафиг нужно!
 
PavelДата: Вторник, 08.04.2008, 11:15 | Сообщение # 3
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Кстати, промежуток проверки можно сузить. Для четных чисел в два раза, а для нечетных в три раза. Думаю, понятно почему.
 
AlexanderДата: Вторник, 08.04.2008, 16:35 | Сообщение # 4
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
Для четных чисел в два раза, а для нечетных в три раза.

Вы что, из математиков??? Это они любят говорить фразы, которые потом по пол дня додумывать надо smile . Поэтому просто сравниваем до квадратного корня и всё.


Скажем дружно- нафиг нужно!
 
PavelДата: Вторник, 08.04.2008, 17:10 | Сообщение # 5
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Нет мы не из математиков. Вот напрмер:
8 кратно 4, 4 - половина. А вот 8 на 5 не коратно. Так что смысла дальше перебирать нет. А насчет корня как вариант, но для не для нечетных чисел. Можешь сам, Alexander, проверить!
 
AlexanderДата: Среда, 09.04.2008, 03:39 | Сообщение # 6
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Ой, да. Корень это из другой оперы. Я просто другу вчера курсовую на Сях дописывал, там была небольшая загвоздка с корнем, вот я его и леплю везде smile . Но проверять число на чётность не рационально. Если б у нас были числа по 60-70 знаков, то да, а в паскале нет встроенной поддержки таких чисел, поэтому проверка на чётность будет есть столько же ресурсов, сколько и сам перебор.

Скажем дружно- нафиг нужно!
 
PavelДата: Среда, 09.04.2008, 13:57 | Сообщение # 7
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Quote
нет встроенной поддержки таких чисел

как так нет? odd() - вот она! Стоит в начале сделать проверку и все.
 
AlexanderДата: Среда, 09.04.2008, 16:34 | Сообщение # 8
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
как так нет? odd() - вот она!

O_o, а я думал odd только проверяет на число на нечётность biggrin . Ну раз поддержка таких чисел есть, то продемонстрируйте на простеньком примере(посчитать 10^(40)+1).
А по поводу быстродействия решим вечером, надо посмотреть под отладчиком генерируемый код и всё станет ясно wink .


Скажем дружно- нафиг нужно!
 
PavelДата: Среда, 23.04.2008, 16:19 | Сообщение # 9
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Quote (Alexander)
Ну раз поддержка таких чисел есть, то продемонстрируйте на простеньком примере(посчитать 10^(40)+1).

Во первых, если вычислить это выражение и если оно не будет больше типа, указанного типа во входящем параметры процедуры, то посчитает. И вот еще: функция эта дает булевский результат, т.е. если нечетное число, то True, если наоборот, то False. Что ж тут неясного-то.
 
AlexanderДата: Среда, 23.04.2008, 18:24 | Сообщение # 10
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
если оно не будет больше типа, указанного типа во входящем параметры процедуры

без "если". В паскале поддерживаются числа до 2^(32)-1, а тут 10^(40), разве не очевидно wink .
Quote
Что ж тут неясного-то.

А неясно было, сколько тактов уйдёт на вызов и отработку функции odd, а сколько на виток цикла. У меня вышло 16 на odd и примерно 8 на виток цикла.... Поэтому проверить на чётность всё-таки стоит, а я этого раньше не делал sad .


Скажем дружно- нафиг нужно!
 
PavelДата: Четверг, 24.04.2008, 08:22 | Сообщение # 11
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Quote (Alexander)
А неясно было, сколько тактов уйдёт на вызов и отработку функции odd, а сколько на виток цикла. У меня вышло 16 на odd и примерно 8 на виток цикла.... Поэтому проверить на чётность всё-таки стоит, а я этого раньше не делал

про такты я ничего не слыхал от тебя! в прошлом посте.
Quote (Alexander)
ез "если". В паскале поддерживаются числа до 2^(32)-1, а тут 10^(40), разве не очевидно

в плане этого, я могу сказать, что даже не собирался считать. Хоть это и очевидно. Посмотрев на число я и сказал, что функцию ограничивает (и Паскаль) ограниченность типов данных.
По поводу производительности: odd мы проверяем до цикла, и вот если честно, на наших компах вывод даже одной строки будет медленнее, чем вся эта программа. Я вот хочу поставить эмулятор 286 и пробовать свои проги (по чмсленным методам), так они нуждаются в оптимизации больше всех. biggrin
 
AlexanderДата: Четверг, 24.04.2008, 09:17 | Сообщение # 12
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Quote
про такты я ничего не слыхал от тебя! в прошлом посте.

Смотри раньше:
Quote
бла-бла-бла... поэтому проверка на чётность будет есть столько же ресурсов, сколько и сам перебор.

Quote
odd мы проверяем до цикла

biggrin . Хочу посмотреть на того, кто проверит уже после начала цикла biggrin . Хотя сам видел в кодах такие перлы... Правда всё на сях, т.к. он для меня родной:
Code
for(int i=0;i<k;i++)
{
    ....
    if( f(x) )
    {
       break;
       break;
       break;
    }
}

На вопрос "а зачем три раза?" был получен гениальный ответ: "А чтоб наверняка!".


Скажем дружно- нафиг нужно!
 
PavelДата: Четверг, 24.04.2008, 18:24 | Сообщение # 13
Приближенный
Группа: Модераторы
Сообщений: 210
Репутация: 17
Замечания: 0%
Статус: Offline
Quote (Alexander)
На вопрос "а зачем три раза?" был получен гениальный ответ: "А чтоб наверняка!".

Ну блин! biggrin biggrin biggrin Я видел:
Code
if true = false then exit;
biggrin
Ксожалению того человека, кто это написал не видел.
 
AlexanderДата: Четверг, 24.04.2008, 18:31 | Сообщение # 14
Всевышний
Группа: Модераторы
Сообщений: 475
Репутация: 16
Замечания: 0%
Статус: Offline
Ну это всё безобидные ошибки. Я по сети знаю одного кадра, который при очищении временного каталога, проверял только не называется ли файл ".", а ".." не проверял. Винда в тот день больше не запускалась cry biggrin biggrin

Скажем дружно- нафиг нужно!
 
М@РИНКАДата: Пятница, 02.05.2008, 01:13 | Сообщение # 15
Новичок
Группа: Пользователи
Сообщений: 1
Репутация: 0
Замечания: 0%
Статус: Offline
Помогите, являються ли x и e дружествами? спасибо заранее)))
 
  • Страница 1 из 2
  • 1
  • 2
  • »
Поиск:

Copyright MyCorp © 2025
Используются технологии uCoz
javascript:;" rel="nofollow" onclick="loginPopupForm(); return false;