type complex= record re,im:real; end;
var a:array [1..10] of complex;
...
min2:=1e20;
for i:=1 to 10 do
if sqr(re)+sqr(im)<min2 then begin
min2:=sqr(re)+sqr(im);
minn:=i;
end;
{Ну min2 - не сам модуль, а его квадрат, но разницы нет,}
{кроме времени, если чисел ооочень много}
{sqrt(min2) - сам модуль, minn - номер в массиве}
Дано десять комплексных чисел. Найти минимальное по модулю.
Условие в заголовке.
Если кто паможет буде очень благодарен.:)
Вроде ничего сложного...
Цитата: Somebody
Вроде ничего сложного...
Код:
type complex= record re,im:real; end;
var a:array [1..10] of complex;
...
min2:=1e20;
for i:=1 to 10 do
if sqr(re)+sqr(im)<min2 then begin
min2:=sqr(re)+sqr(im);
minn:=i;
end;
{Ну min2 - не сам модуль, а его квадрат, но разницы нет,}
{кроме времени, если чисел ооочень много}
{sqrt(min2) - сам модуль, minn - номер в массиве}
var a:array [1..10] of complex;
...
min2:=1e20;
for i:=1 to 10 do
if sqr(re)+sqr(im)<min2 then begin
min2:=sqr(re)+sqr(im);
minn:=i;
end;
{Ну min2 - не сам модуль, а его квадрат, но разницы нет,}
{кроме времени, если чисел ооочень много}
{sqrt(min2) - сам модуль, minn - номер в массиве}
Можно исправить ошибки и слегка оптимизировать:
[highlight=pascal]
type
TComplex = record
re : Real;
im : Real;
end;
var
A : array [1..10] of TComplex;
min : TComplex;
...
min := A[1];
for i := 2 to 10 do
if Sqr(A.re) + Sqr(A.im) < Sqr(min.re) + Sqr(min.im) then begin
min.re := A.re;
min.im := A.im;
end;
...
[/highlight]
А где были ошибки? Ну если не считать, что квадрат модуля может быть больше 1e20? TComplex вместо complex - ну это, согласен, получше. А соптимизировать если и можно - то уж точно не добавлением двух возведений в квадрат в цикл. Кстати, ещё написать можно просто min:=A.
Цитата: Somebody
А где были ошибки? Ну если не считать, что квадрат модуля может быть больше 1e20? TComplex вместо complex - ну это, согласен, получше.
if sqr(re)+sqr(im)... - что такое re и im. Ну и на следующей строчке. Ошибка из-за невнимательности.
Цитата: Somebody
А соптимизировать если и можно - то уж точно не добавлением двух возведений в квадрат в цикл. Кстати, ещё написать можно просто min:=A.
Возведений в квадрат столько же, ведь данный фрагмент твоего кода:
Код:
if sqr(re)+sqr(im)<min2 then begin
min2:=sqr(re)+sqr(im);
min2:=sqr(re)+sqr(im);
также находится в цикле.
В данном случае мой код выигрывает четыре возведения в квадрат (одна итерация).
Можно еще выиграть используя умножение вместо возведения в квадрат.
По поводу присвоения - ты прав. Можно немного подкорректировать код:
[highlight=Pascal]
type
TComplex = record
re : Real;
im : Real;
end;
var
A : array [1..10] of TComplex;
min : TComplex;
...
min := A[1];
for i := 2 to 10 do
if A.re*A.re + A.im*A.im < min.re*min.re + min.im*min.im then
min := A;
...
[/highlight]
Мой код возводит в квадрат при каждой итерации 2 раза, а ещё 2 раза - в if'е, который выполняется не всегда. Твой код выигрывает 4 итерации только на убываьщей последовательности. А можно тогда вообще в цикле считать квадрат модуля 1 раз (2 возведения в квадрат) и куда-нибудь его сохранять и, если надо, сохранённое значение писать в min2. А вот замена sqr на умножения в Delphi ничего не даёт, думаю, в Паскале тоже; sqr не вызывается, как функция, а просто компилятор непосредственно ставит умножение.