Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Вычисление С в степени N с минимальным количеством умножений [D6]


Страницы:   1 2

Студент:( ©   (2005-09-24 01:28:00) 

Господа програмисты, помогите плиз
Срочно необходимо такую вещь в универ:
реализовать программу в которую вводится целых числа C и N
необходимо вычислить С в степени N используя минимальное число операций умножения
Если не совсем ясно высказался:
Если c=2 n=7
то лучшее это
c:=c*c;
c:=c*c;
c:=c*c;
c:=c/2;

(естесно не в таком виде, с if, for и самым простым я знаком)

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


пятиклассник   (2005-09-26 08:52:00) [1]

В [20] с ошибочкой. Вот исправленный вариант:)

function TForm1.Exponentation(n, d: Integer): Currency;
var
 i,k: Integer;
 tmp1,tmp2: Int64;
begin
 if d = 0 then
 begin
   Result := 1;
   Exit;
 end;

 tmp1 := Abs(n);
 for i := 2 to Abs(d) do
 begin
   tmp2 := 0;
   for k := 1 to Abs(n) do
   begin
     tmp2 := tmp2 + tmp1;
   end;
   tmp1 := tmp2;
 end;

 if d < 0 then
   Result := 1/tmp1
 else
   Result := tmp1;

 if (n < 0) and (d mod 2 <> 0) then
 Result := -Result;
end;


пятиклассник   (2005-09-25 22:32:00) [2]


> Some   (25.09.05 22:28) [22]

О боже!
А что, эту функцию нельзя будет использовать в консольном приложении? Она же чиста от VCL, а выше - это только пример использования ;)


Some   (2005-09-25 22:28:00) [3]

пятиклассник   (25.09.05 21:23) [21]

а главное - приложение консольное...


пятиклассник   (2005-09-25 21:23:00) [4]

Забыл добавить - операций умножения совсем нету :))


пятиклассник   (2005-09-25 21:21:00) [5]

:))

procedure TForm1.ButtonCalculateClick(Sender: TObject);
begin
 EditResult.Text := FloatToStr(Exponentation(StrToInt(EditNumber.Text),
                                 (StrToInt(EditDegree.Text))));
end;

function TForm1.Exponentation(n, d: Integer): Currency;
var
 i,k: Integer;
 tmp1,tmp2: Int64;
begin
 if d = 0 then
 begin
   Result := 1;
   Exit;
 end;

 tmp1 := n;
 for i := 2 to Abs(d) do
 begin
   tmp2 := 0;
   for k := 1 to n do
   begin
     tmp2 := tmp2 + tmp1;
   end;
   tmp1 := tmp2;
 end;

 if d < 0 then
   Result := 1/tmp1
 else
   Result := tmp1;
end;


Manufel   (2005-09-25 18:56:00) [6]

Значит я не прав, но в любом случае уверен что эти методы  используют не малое количество умножений...


GrayFace   (2005-09-25 18:22:00) [7]

Manufel   (25.09.05 17:23) [15]
Если кто не знает Ln и Exp вычисляются по формуле ряда Тейлора

Если ты не знаешь, для точного вычисления с большой скоростью ряд Тэйлора мало пригоден. Для вычисления ln, exp, sin, cos используются более сложные методы.


Manufel   (2005-09-25 17:23:00) [8]

Удалено модератором


Manufel   (2005-09-25 17:23:00) [9]

Удалено модератором


Manufel   (2005-09-25 17:23:00) [10]

См http://www.delphimaster.ru/cgi-bin/forum.pl?id=1127510896&n=0

А на мой взгляд лучшее решение здесь: Lamer@fools.ua ©   (24.09.05 01:55) [2]

А вот использование Exp и Ln
здесь совершенно не к чему, возводится то целое число в целую степень, а вот Ln и Exp вычисляется С ОЧЕНЬ БОЛЬШИМ количеством умножений
Если кто не знает Ln и Exp вычисляются по формуле ряда Тейлора
e^x=E( (x^n)/x!)
Где Е() - сигма, х! - факториал х, а n>=0, то есть у нас получается бесконечный числовый ряд(иначе можно записать e^x=1+x+(x^2)/2+(x^3)/6 и т.д.), который обрезается в компьютере до некоторой степени, достаточной для очень маленького приближения
Для логарифма ситуация та же


Германн   (2005-09-25 02:38:00) [11]

2 jack128 ©   (25.09.05 02:19) [11]
Не Жень. Имхо он не спутал, а смешал в кашу все ответы после своих!
И уже дальше отвечал на свои глюки. :)

2 Lamer@fools.ua ©
При чем тут  "сопроцессор"? В учебной задаче?

Жень! Ну все-таки "а"декватная!
Я, конечно понимаю, что каждый стремиться достичь уровня АП! Но не такими же способами! :)


Lamer@fools.ua   (2005-09-25 02:34:00) [12]

>> jack128 ©   (25.09.05 02:19) [11]

Чтобы прекратить бессмысленный спор, будем считать, что у меня был внезапный приступ телепатии. Идёт?


TStas   (2005-09-25 02:21:00) [13]

А при вычислении корня используется деление, которое по затратности вообще с умножением и сравнивать нельзя


jack128   (2005-09-25 02:19:00) [14]

а ну да, со мной и спутал наверно. Глубина моей мысли была заключена в постановки задачи - функция должна использовать
Студент:(   (24.09.05 1:28)
минимальное число операций умножения


Если будет еще менее одекватная постановка задачи, так я рожу еще более "глубокую" мысль ;)


Lamer@fools.ua   (2005-09-25 02:18:00) [15]

>> Германн ©   (25.09.05 02:10) [9]

Фраза, процитированная в [6] относится именно к логарифму и экспоненте.

Я, честно говоря, вообще слабо понял, как [6] относится к вопросу автора топика.

>> jack128 ©   (25.09.05 01:56) [8]

> Ну знаешь, мне кажется что сопрцессор не "умножает", а выставляет уровни напряжения на дорожках или что у него там есть ;)

Как именно процессор умножает не имеет значения, за исключением случая, когда используются табличные заранее рассчитанные данные.


Германн   (2005-09-25 02:10:00) [16]

2 Lamer@fools.ua ©   (25.09.05 01:38) [7]
>Поясните глубину мысли в использовании экспоненты и логарифма с целью вычислить значение целого числа, возведённого в целую степень.

А где и когда я об этом говорил?
Или ты меня с кем-то спутал?


jack128   (2005-09-25 01:56:00) [17]

Lamer@fools.ua ©   (24.09.05 23:30) [5]
Логарифм и экспонента, конечно, сопроцессором считаются, только ему их ещё тоже вычислить надобно. И там будет далеко не одно умножение.
Ну знаешь, мне кажется что сопрцессор не "умножает", а выставляет уровни напряжения на дорожках или что у него там есть ;)
В любом случае молжно так модифицировать твой код(для целых чисел)

function IntPower(X: Cardinal; Y: Cardinal): Int64;
begin
Result := 1;
while Y > 0 do
begin
  while not Odd(Y) do
  begin
    Y := Y div 2;
    X := Round(X / (1/ X))
  end;
  Dec(Y);
  Result := Round(Result / (1 / X));
end;
end;


Lamer@fools.ua   (2005-09-25 01:38:00) [18]

>> Германн ©   (25.09.05 01:08) [6]

Поясните глубину мысли в использовании экспоненты и логарифма с целью вычислить значение целогочисла, возведённого в целуюстепень.


Германн   (2005-09-25 01:08:00) [19]

2 Lamer@fools.ua ©   (24.09.05 23:30) [5]
>  только ему их ещё тоже вычислить надобно. И там будет далеко не одно умножение.

Но причем тут "студент", которому "препод" задал задачку в "универе"?

Имхо, скорее всего тут "задачка для паскаля без дополнительных библиотек". Хотя опять же имхо, можно было бы придумать более "жизненноважную" задачу. Наверняка в "уроках Юрия Зотова" были схожие задачи!


Lamer@fools.ua   (2005-09-24 23:30:00) [20]

>> jack128 ©   (24.09.05 22:57) [4]

Обманывать нехорошо. Во-первых, формально одно умножение есть. Во-вторых, фактически их больше. Логарифм и экспонента, конечно, сопроцессором считаются, только ему их ещё тоже вычислить надобно. И там будет далеко не одно умножение.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо