Показать сообщение отдельно
Старый 25.01.2009, 10:27   #31 (permalink)
Vladimir_S
Специалист
 
Регистрация: 27.08.2008
Адрес: Санкт-Петербург
Сообщений: 27,807
Сказал(а) спасибо: 340
Поблагодарили 583 раз(а) в 208 сообщениях
Репутация: 113184
По умолчанию

Цитата:
Сообщение от ummasha Посмотреть сообщение
Вот еще одна задача из книжки: найти все натуральные числа a,b,c из интервала от 1 до 20, для которых выполняется равенство:а2+ b2 = c2

Program KR_2_Var1_2;
Var a,b,c:integer;
Begin
For a:=1 to 20 do
For b:=1 to 20 do
For c:=1 to 20 do
If sqr(a)+sqr(b)=sqr(c) then writeln(a,' ',b,' ',c);
readln;
end.

Задача решается без всяких проблем, НО: в книжке вместо этого было а*а+b*b=с*с. И это "типа" квадраты чисел?
В книжке, Маша, всё правильно. Тут есть одна тонкость. Употребив функцию SQR, Вы преобразовали целочисленный формат (Integer, Word, Byte...) в вещественный (Real, Extended...), что "не есть хорошо" хотя бы потому, что в этом формате операция проверки на равенство может, в зависимости от аппаратной реализации, оказаться не совсем корректной, поскольку в "дальних" разрядах может висеть "мусор", и как на него среагирует транслятор, неведомо (например, 2 может преобразоваться во что-нибудь вроде 2.0000000005298307645). Я в своих программах вообще избегаю таких действий, заменяя их при необходимости чем-нибудь вроде if Round(a*100000)=Round(b*100000) then ...
Vladimir_S вне форума   Ответить с цитированием
Ads

Яндекс

Member
 
Регистрация: 31.10.2006
Сообщений: 40200
Записей в дневнике: 0
Сказал(а) спасибо: 0
Поблагодарили 0 раз(а) в 0 сообщениях
Репутация: 55070