Десять способов решения задач на Паскале

Задача М2Б4_6

  Дано действительное число 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 операции сложения, два вычитания и три умножения}

uses crt;

var c,n:integer;

     d,x:real;

begin

        clrscr; write('vvedite znachenie X>0 '); readln(x);

         c:=2; n:=4; d:=0;

          repeat

             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;

          until n<0;

         writeln('d=',d:3:2);

 end.

 

program m2b4_63;

{ используем 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.

Для любых значений х программу необходимо доработать следующим образом, либо поставить проверку на соответствие if x<0 then x:=x*-1, либо изменить формулу c*exp(n*ln(x)) следующим образом -  c*exp(n*ln(abs(x)))

 

program m2b4_66;

{ используем 2 операции сложения, два вычитания и два умножения}

uses crt;

var c,n:integer;

     d,x,k:real;

begin

                  clrscr; write('vvedite luboe znachenie x<>0 '); readln(x);

         c:=2; n:=4; d:=0;

          repeat

            begin

                   k:= c*exp(n*ln(abs(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.

Остается только запустить на исполнение все выше перечисленные программы и убедится, что они выдают те же значения, что и программа, написанная нами ранее для решения поставленной задачи в лоб без всяких выкрутасов и исключений…


Copyright © somit.ru & А. Козлов, 2009
Рейтинг@Mail.ru

Rambler's Top100