Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2005.10.16;
Скачать: [xml.tar.bz2];

Вниз

Вычисление С в степени 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.035 c
3-1125496254
Domkrat
2005-08-31 17:50
2005.10.16
Изменить имя пользователя и пароль с помощью API


1-1127496363
френк
2005-09-23 21:26
2005.10.16
Z-order, но вопрос другой )


3-1122637660
tanya
2005-07-29 15:47
2005.10.16
Как найти (все) MSSQL серверы в локальной сети


2-1126443994
Серёга
2005-09-11 17:06
2005.10.16
Сохранить в файл(Pascal)


1-1127486011
злобная танька
2005-09-23 18:33
2005.10.16
Локальные типизированные константы





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский