Дано действительное число x. Не пользуясь никакими другими арифметическими операциями,
кроме умножения, сложения и вычитания, вычислить 2x4 - 3x3 + 4x2 - 5x + 6.Разрешается использовать не более 4 умножений
и 4 сложений и вычитаний.
Решение
данной задачи в лоб очень простоd:=2*x*x*x*x-3*x*x*x+4*x*x-5*x+6 и оно нам
пригодится для проверки результатов полученных обходными путями.
Введя выше указанный код и, запустив его на исполнение, получим следующие
результаты:
при х=1 d=4, при x=2 d=20 и при x=10 d=17356 этого
нам будет вполне достаточно для проверки
Следует
учесть, что решение данной задачи имеет смысл для x>0.
Ясно,что при х=0, d=6, (реализацию этого решения оставляем за вами), а при значениях
меньших 0 программа будет выдавать ошибку. Алгоритм предполагает
использование логарифма, поскольку мы воспользуемся аналогом
возведения в степень xn = exp(n*ln(x)), позволяющего большое количество операций
произведений свести всего к одному
дейсьтвию. Так например
x6 = x*x*x*x*x*x*x
= exp(6*ln(x))
program
m2b4_6;
{ используем 2 сложения, 2 вычитание
и три умножения}
uses crt;
var c,n:integer; d,x:real;
begin
clrscr;
write('vvedite znachenie X>0 ');
read(x);
c:=2; n:=4; d:=0;
while n>=0 do begin
d:=d+c*exp(n*ln(x));
if c<0 then c:=(c-1)
else c:=(c+1);
c:=c*-1;
n:=n-1;
end;
writeln('d=',d:3:2);
end.
program
m2b4_61;
{ используем 1 сложение, 1 вычитание
и три умножения}
uses crt;
var c,n:integer; d,x,k:real;
begin
clrscr;
write('vvedite znachenie X>0 ');
read(x);
n:=4; d:=0;
for c:=2 to 6 do begin
k:=c;
if k mod 2 = 1 then k:=k*-1;
d:=d+k*exp(n*ln(x));
n:=n-1;
end;
writeln('d=',d:3:2);
end.
program
m2b4_62;
{ используем 2 операции сложения,
два вычитания и три умножения}
{ используем 2 операции сложения,
два вычитания и четыре умножения}
uses crt;
var c,n:integer;
d,x:real;
begin
clrscr; write('vvedite X>0');
readln(x);
c:=2; n:=4; d:=0;
repeat
begin
if c mod 2=0 then d:=d+c*exp(n*ln(x))
else d:=d-c*exp(n*ln(x));
c:=c+1; n:=n-1;
end;
until n<0;
writeln('d=',d:3:2);
end.
program
m2b4_64;
{ используем 2 операции сложения,
два вычитания и четыре умножения}
uses crt;
var c,n:integer;
d,x:real;
begin
clrscr; write('vvedite X>0
'); readln(x);
c:=2; n:=4; d:=0;
repeat
begin
if c mod 2=1 then d:=d-c*exp(n*ln(x))
else d:=d+c*exp(n*ln(x));
c:=c+1; n:=n-1;
end;
until n<0;
writeln('d=',d:3:2);
end.
program
m2b4_65;
{ используем 2 операции сложения,
два вычитания и два умножения}
uses crt;
var c,n:integer;
d,x,k:real;
begin
clrscr; write('vvedite x>0
'); readln(x);
c:=2; n:=4; d:=0;
repeat
begin
k:= c*exp(n*ln(x))
if c mod 2=1 then d:=d-k
else d:=d+k;
c:=c+1; n:=n-1;
end;
until n<0;
writeln('d=',d:3:2);
end.
Для
любых значений х программу необходимо доработать следующим образом,
либо поставить проверку на соответствие ifx<0 thenx:=x*-1, либо изменить
формулуc*exp(n*ln(x)) следующим образом -c*exp(n*ln(abs(x)))
program
m2b4_66;
{ используем 2 операции сложения,
два вычитания и два умножения}
Остается
только запустить на исполнение все выше перечисленные программы и
убедится, что они выдают те же значения, что и программа, написанная
нами ранее для решения поставленной задачи в лоб без всяких выкрутасов
и исключений…