Показать полную графическую версию : [решено] Помогите с задачей /Pascal/
Drongo, Habetdin, Ошибка логическая, поэтому я так сильно ругаюсь. Мы до Паскаля еще не дошли.
Скобки в данном случае не причем. Ну причем конечно, но не в них дело.
Кстати я бы их оставил, они погоды не сделают, но и не помешают.
(Паскаль есть выражение мысли в семантике языка.
Мысль -> Математика, логика -> Семантический перевод в язык программирования -> код Pascal)
Мысль - ясна
Мат., логика - присутствует ошибка. Ошибка. Однотипная 1ая и 2ая.
Семантический перевод в язык программирования - проблем нет.
код Pascal - ошибочен в силу ошибки в логике, но не в силу семантического перевода.
Сутки прошли.
Habetdin, вспоминаем теорему Пифагора. "Сумма квадратов катетов равна квадрату гипотенузы."
Мы воспользовались ей для нахождения расстояния от центра до дерева.
С математической точки зрения, операция извлечения квадратного корня - не представляет сложностей.
С аппаратной точки зрения - это наказание. (медленное, не точное, просто брр) Поэтому от него пытаются уйти всем возможными способами. Чтобы вообще с плавающей запятой не работать.
Из теоремы имеем:
A^2+B^2=C^2; (1)
sqrt(A^2+B^2) = C; (2)
Что имеем :
x*x+y*y < r2; -> X^2 + Y^2 = R2 (3)
Проводим аналогию формулы 3 и 1, разницу видишь? Вот она ошибка. У тебя была правильная попытка ввести квадратный корень, но затем он потерялся.
Самым элегантным, по моему, решением является возведение R2 в квадрат.
if ((x*x+y*y< r2*r2 ) and (x*x+y*y> r1*r1)) then k:=k+1;
В таком случае программа выдает верное решение.
Неверное условие началось с 7ого сообщения от участника emTPy.
for i:=-r2 to r2 do
for j:=-r2 to r2 do
if ((i*i+j*j<r2) and(i*i+j*j>r1)) then rez:=rez+1; ».
Да, решение более удачно чем ввязываться в вычисление корня (хотя требует вдвое большую разрядную сетку), но ошибка была пропущена, и далее начался твой копи-паст.
Habetdin, не в обиду, но на будущее. Внимательно смотри, что ты копируешь!
Успехов! :)
P.S. emTPy, простите, если задел.
Habetdin
10-11-2009, 11:04
Вот что получилось, работает:
program Park;
var r1,r2,x,y,n: integer;
l:real;
begin
assign(input,'input.txt');
reset(input);
read(input,r1,r2);
close(input);
n:=0;
for x:=-r2 to r2 do begin
for y:=-r2 to r2 do begin
l:=sqrt(x*x+y*y);
if (l>r1) and (l<r2) then
n:=n+1;
end;
end;
assign(output,'output.txt');
rewrite(output);
write(output,n);
close(output);
end.
Вопрос: возможна ли оптимизация этого кода? :)
Upd: судя по незамеченному посту #23, оптимизация возможна..
:closed-to
оптимизация возможно если рассмотреть одну четверть полученный результат умножить на 4
и положительные части осей умножив результат осей на 2
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.