Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Дано десять комплексных чисел. Найти минимальное по модулю.

37K
16 апреля 2008 года
farel
2 / / 16.04.2008
Нужна помощь в решении задачки на Pascal.
Условие в заголовке.
Если кто паможет буде очень благодарен.:)
5.3K
18 апреля 2008 года
Somebody
185 / / 24.12.2006
Вроде ничего сложного...
Код:
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 - номер в массиве}
9.4K
18 апреля 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: 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 - номер в массиве}



Можно исправить ошибки и слегка оптимизировать:

[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]

5.3K
19 апреля 2008 года
Somebody
185 / / 24.12.2006
А где были ошибки? Ну если не считать, что квадрат модуля может быть больше 1e20? TComplex вместо complex - ну это, согласен, получше. А соптимизировать если и можно - то уж точно не добавлением двух возведений в квадрат в цикл. Кстати, ещё написать можно просто min:=A.
9.4K
19 апреля 2008 года
AIGrifon
165 / / 13.11.2007
Цитата: 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);


также находится в цикле.

В данном случае мой код выигрывает четыре возведения в квадрат (одна итерация).

Можно еще выиграть используя умножение вместо возведения в квадрат.

По поводу присвоения - ты прав. Можно немного подкорректировать код:

[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]
5.3K
20 апреля 2008 года
Somebody
185 / / 24.12.2006
Мой код возводит в квадрат при каждой итерации 2 раза, а ещё 2 раза - в if'е, который выполняется не всегда. Твой код выигрывает 4 итерации только на убываьщей последовательности. А можно тогда вообще в цикле считать квадрат модуля 1 раз (2 возведения в квадрат) и куда-нибудь его сохранять и, если надо, сохранённое значение писать в min2. А вот замена sqr на умножения в Delphi ничего не даёт, думаю, в Паскале тоже; sqr не вызывается, как функция, а просто компилятор непосредственно ставит умножение.
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог