Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 06.09.2009, 21:49   #1
Rusl92
Форумчанин
 
Аватар для Rusl92
 
Регистрация: 30.03.2008
Сообщений: 392
Сообщение Решить уравнение : используя схему горнера решить с меньшим количеством умножений!

Здравствуйте!
дано уравнение
y=(x^(n^2))/( a^n)
х в степени {n в квадрате} - все это деленное на а в степени nПредпод задал задание: решить уравнение с помощью схемы горнера (он хотел, чтобы мы уменьшили количество умножений), не используя процедурного программирования!
Приведу пример, в котором уравнение решается без этой схемы, то есть максимальным количеством умножений.
Код:
var a,x,n,i,chislitel,znamenatel:integer;
begin
    read(a,x,n);
    i:=1;
    chislitel:=1;
    while (i<=(n*n)) do
     begin
       chislitel:=x*chislitel;
       inc(i);
     end;
   i:=1;
   znamenatel:=1;
   while (i<=n) do
    begin
     znamenatel:=znamenatel*a;
     inc(i);
    end;
   y:=chislitel/znamenatel;
   write(y);
   readln
end.
В данном случае используется максимальное количество умножений
как написать прогу так, чтобы количество умножений уменьшилось?
Заранее спасибо!
Программирование - это великое искусство... Такое же как например и живопись!
Rusl92 вне форума Ответить с цитированием
Старый 06.09.2009, 23:24   #2
Daramant
Форумчанин
 
Регистрация: 06.01.2009
Сообщений: 340
По умолчанию

Попробуй так:
Код:
function Solve(x, n, a: Integer): Real;
var
  xn, an: Integer;
begin
  xn := 1;
  an := 1;

  while n > 0 do begin
    if n mod 2 = 1 then begin     {или "if (n and 1 = 1)" для бОльшей скорости выполнения}
      xn := xn * x;
      an := an * a;
    end;

    x := x * x;
    a := a * a;
    n := n div 2;        {или напишите "n := k shr 1;" для бОльшей скорости выполнения}
  end;

  Result := xn * xn / an;
end;
Я переделал алгоритм быстрого возведения в степень.
Описание алгоритма:
http://ru.wikipedia.org/wiki/%D0%90%...B5%D0%BD%D1%8C
Истинный успех – это то, что Вы сделали в сравнении с тем, что могли бы сделать.
Никогда не бойся делать то, что ты не умеешь. Помни, ковчег был построен любителем. Профессионалы построили "Титаник".
Daramant вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
помогите решить уравнение fist53 Паскаль, Turbo Pascal, PascalABC.NET 3 04.06.2009 22:47
Помогите,пожалуйста, решить дифференциальное уравнение Emi Свободное общение 1 22.05.2009 17:36