Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2005.10.16;
Скачать: CL | DM;

Вниз

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

 
Студент:(   (2005-09-24 01:28) [0]

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

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

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


 
Германн ©   (2005-09-24 01:47) [1]

Я лично не понял связку "D6 в сабже" и  "минимальное число операций умножения". Причем нет никаких упоминаний об ASM?

Хотя, кто их знает! Нынешних преподов т.е.!

Да! Хотя еще неизвестно о каком предмете универа идет речь.
Я то об алгоритмах программирования.


 
Lamer@fools.ua ©   (2005-09-24 01:55) [2]

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 := Sqr(X);
   end;
   Dec(Y);
   Result := Result * X;
 end;
end;


 
incolex ©   (2005-09-24 22:50) [3]

// Lamer@fools.ua ©   (24.09.05 01:55) [2]

Ты конечно хитрец :-) но зачемже пудрить мозги человеку, зачем расписывать существующую функцию {IntPower (X: Extended; Y: Integer ): Extended;} (хотя в Delphi она написана на ASM), кстати эта ф-ция возводит число только в цлочисленную степень, а вот к примеру, {Power ( X, Y: Extended ): Extended;} - возводит вдробную степень.


 
jack128 ©   (2005-09-24 22:57) [4]

Без единого умножения
Result := Exp(Ln(C)*abs(N));
if N < 0 then
 Result := 1 / Result;


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

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

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


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

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

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

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


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

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

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


 
jack128 ©   (2005-09-25 01:56) [8]

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;


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

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

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


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

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

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

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

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

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

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


 
jack128 ©   (2005-09-25 02:19) [11]

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


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


 
TStas ©   (2005-09-25 02:21) [12]

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


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

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

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


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

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

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

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


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

См http://delphimaster.net/view/1-1127510896/

А на мой взгляд лучшее решение здесь: 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 и т.д.), который обрезается в компьютере до некоторой степени, достаточной для очень маленького приближения
Для логарифма ситуация та же


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

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


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

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


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

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

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


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

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


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

:))

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;


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

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


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

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

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


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


> Some   (25.09.05 22:28) [22]

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


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

В [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;



Страницы: 1 вся ветка

Текущий архив: 2005.10.16;
Скачать: CL | DM;

Наверх




Память: 0.53 MB
Время: 0.03 c
4-1124002284
GreySkil
2005-08-14 10:51
2005.10.16
Права доступа


3-1125991945
Tonich
2005-09-06 11:32
2005.10.16
Копировать Select из одной таблицы в другую


2-1126454439
Зм1й
2005-09-11 20:00
2005.10.16
Вывести собщение


14-1127380649
__DATA__
2005-09-22 13:17
2005.10.16
Поиск наиближнего времени к текущему из списка


1-1127831282
Игорь Степанов
2005-09-27 18:28
2005.10.16
Программное управление скоростью повтора кода клавиши