Оптимизируйте программы ниже, так что бы они выполнялись за меньшее количество операций. 1)var n , m :integer;
k : real;
begin
readln(n);
m:=1;
while n>0 do begin
m:=m+n*n*n;
n:=n-1;
end;
k:=trunc(sqrt(m));

writeln(k);
end.

2) var n , m, i :integer;
begin
readln(n);
m:=2;
i:=0;
while m
if n mod m <> 0 then i:=i+1;
m:=m+1;
end;
if (i=n-2) or (n=1) then writeln(n);
end.

Sashka1611 Sashka1611    1   19.12.2021 14:37    58

Ответы
адай6 адай6  26.12.2023 18:19
Добро пожаловать в класс! Давайте посмотрим на ваши программы и оптимизируем их для выполнения за меньшее количество операций.

Программа 1:
```pascal
var
n, m: integer;
k: real;

begin
readln(n);
m := 1;
while n > 0 do
begin
m := m + n * n * n;
n := n - 1;
end;
k := trunc(sqrt(m));
writeln(k);
end.
```

Прежде всего, давайте рассмотрим, что делает эта программа. Она считывает целое число `n` с клавиатуры и затем выполняет ряд операций с помощью цикла `while`. Она вычисляет значениe `m` на основе `n`, затем извлекает квадратный корень из `m` (с помощью функции `trunc(sqrt(m))`) и выводит результат на экран с помощью `writeln`.

Первая оптимизация, которую можно сделать, это удалить использование числа `m`. Мы можем сосредоточиться только на переменной `n`. Также, можно отказаться от использования вещественного числа `k`, поскольку квадрат корня всегда будет целым числом в данной задаче.

Вот оптимизированная программа 1:
```pascal
var
n, k: integer;
sum: integer;

begin
readln(n);
sum := 0;
while n > 0 do
begin
sum := sum + n * n * n;
n := n - 1;
end;
k := trunc(sqrt(sum));
writeln(k);
end.
```

Эта оптимизированная программа выполняет то же самое, но без использования лишних переменных и вещественных чисел.

Теперь перейдем ко второй программе:
```pascal
var
n, m, i: integer;

begin
readln(n);
m := 2;
i := 0;
while m < n do
begin
if n mod m <> 0 then
i := i + 1;
m := m + 1;
end;
if (i = n - 2) or (n = 1) then
writeln(n);
end.
```

Эта программа читает целое число `n` с клавиатуры и выполняет цикл `while`. Внутри цикла проверяется, делится ли `n` на `m` без остатка. Если нет, то переменная `i` увеличивается на единицу. Затем `m` увеличивается на один. После цикла проверяется условие, связанное с переменными `i` и `n`, и в зависимости от результата выводится число `n`.

Оптимизации, которые можно сделать в этой программе:
1. Уменьшите количество итераций цикла до `n / 2`, поскольку число не может делиться без остатка на число, большее, чем его половина.
2. Замените условие `(i = n - 2)` на `(i = n - 2) and (n <> 1)`, чтобы избежать лишней проверки в случае, когда `n` равно 1.

Вот оптимизированная программа 2:
```pascal
var
n, m, i: integer;

begin
readln(n);
m := 2;
i := 0;
while m < n / 2 do
begin
if n mod m <> 0 then
i := i + 1;
m := m + 1;
end;
if (i = n - 2) and (n <> 1) then
writeln(n);
end.
```

В этой оптимизированной программе мы проверяем только числа от 2 до `n / 2`, а также учитываем особый случай для числа 1.

Надеюсь, это помогло вам понять оптимизации и принципы их применения для улучшения производительности программ. Если у вас есть еще вопросы, не стесняйтесь задавать их!
ПОКАЗАТЬ ОТВЕТЫ
Другие вопросы по теме Информатика