Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Составьте программу вычисления степени числа А с н 
:(
    Опции темы
teac2012
Дата 9.12.2012, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 5.12.2012

Репутация: нет
Всего: нет



Составьте программу вычисления степени числа А с натуральным показателем n. (записать варианты программы с разными видами циклов while,for) Желательно в turbo c++ 3.0
PM MAIL   Вверх
Zhunko
Дата 9.12.2012, 22:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Это конкурс?  smile 
Код

double Pow(const double dBase, const DWORD dwPow)
 {
   double _dBase = 1;
   for (DWORD i = 0; i < dwPow; i++)
    {
      _dBase *= dBase;
    }
   return(_dBase);
 }


Это сообщение отредактировал(а) Zhunko - 10.12.2012, 00:27
PM MAIL   Вверх
volatile
Дата 9.12.2012, 23:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Цитата(Zhunko @  9.12.2012,  22:45 Найти цитируемый пост)
double Pow(const double dBase, const DWORD dwPow)
 {
   double _dBase = dBase;
   for (DWORD i = 0; i < dwPow; i++)
    {
      _dBase *= dBase;
    }
   return(_dBase);
 }

Zhunko, ай-яй-яй, как не стыдно...


PM MAIL   Вверх
Zhunko
Дата 10.12.2012, 00:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Цитата(volatile @  10.12.2012,  00:20 Найти цитируемый пост)
Zhunko, ай-яй-яй, как не стыдно...

Блин! smile  Приз не получу?
PM MAIL   Вверх
volatile
Дата 10.12.2012, 00:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2107
Регистрация: 7.1.2011

Репутация: 37
Всего: 85



Ладно, чтоб совсем уж скучно не было, я оъявляю конкурс.
Первому, кто напишет эту функцию, без цыклофф (for,while,do), и одним оператором (без вызова библиотечных функций)
+1 в репу.

 smile

PM MAIL   Вверх
Zhunko
Дата 10.12.2012, 02:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Ещё такие циклы умею:
Код

double Pow(const double dBase, DWORD dwPow)
 {
   double dRes = dBase;
   START: dRes *= ((--dwPow) ? (dBase) : (1));
   if (!dwPow) return(dRes); 
   goto START;
 }

volatile, одним оператором?... Может парой операторов побитовых операций?

Это сообщение отредактировал(а) Zhunko - 10.12.2012, 02:49
PM MAIL   Вверх
math64
Дата 10.12.2012, 07:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2505
Регистрация: 12.4.2007

Репутация: 8
Всего: 72



А рекурсию можно?
Код

inline double sqr(double x) { return x*x; }
double pow(double x, int n) {
return n == 0 ? 1 : n == 1 ? x : n < 0 ? 1/pow(-n) : sqr(pow(x, n/2))*pow(x,n%2);
}

PM   Вверх
feodorv
Дата 10.12.2012, 09:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2214
Регистрация: 30.7.2011

Репутация: 11
Всего: 45



Цитата(math64 @  10.12.2012,  08:54 Найти цитируемый пост)
А рекурсию можно?

Ну да, если не стандартные функции и не циклы, то только рекурсия:
Код

double Pow( double A, unsigned int n)
{
  return (n == 0) ? 1 : A*Pow( A, n-1);
}


Добавлено через 4 минуты и 8 секунд
Для teac2012 пояснение варианта math64: Быстрое возведение числа в натуральную степень.


--------------------
Напильник, велосипед, грабли и костыли - основные инструменты программиста...
PM MAIL   Вверх
Zhunko
Дата 10.12.2012, 11:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Индийский алгоритм можно побитовыми операциями сделать в одну строку.
PM MAIL   Вверх
bsa
Дата 10.12.2012, 12:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Zhunko, нука расскажи как?
PM   Вверх
Zhunko
Дата 10.12.2012, 13:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Цитата(bsa @  10.12.2012,  13:59 Найти цитируемый пост)
Zhunko, нука расскажи как?

Если вопрос, как или каким образом, то, конечно, путём написания кода.
Над реализацией не думал. Наверняка можно, но только для целых чисел. Хотя, можно double с мантиссой преобразовать в int, потом восстановить порядок.
PM MAIL   Вверх
bsa
Дата 10.12.2012, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Zhunko @  10.12.2012,  14:37 Найти цитируемый пост)
Над реализацией не думал.
А зря. Если бы думал, то этих 4-х постов бы не было.  smile 

PM   Вверх
Zhunko
Дата 10.12.2012, 14:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 75
Регистрация: 4.11.2009

Репутация: нет
Всего: нет



Цитата(bsa @  10.12.2012,  15:37 Найти цитируемый пост)
А зря. Если бы думал, то этих 4-х постов бы не было.

Если было нельзя, то от Вас было объяснение почему нельзя. И не было Ваших 2-х постов.
Что-то ни у кого одним оператором не получилось.

Это сообщение отредактировал(а) Zhunko - 10.12.2012, 17:06
PM MAIL   Вверх
baldina
Дата 10.12.2012, 16:44 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: 32
Всего: 101



Цитата(Zhunko @  10.12.2012,  14:49 Найти цитируемый пост)
Что-то ни у кого одним операторм не получилось.

есть operator - оператор, операция.
есть statement - оператор, выражение.
наверняка volatile имел в виду statement, т.к. одним оператором (operator) действительно нельзя.

а если statement - тогда можно, код feodorv.

вот еще вариант, быстрое возведение
Код

double pow (double a, unsigned n) {
  return n == 0 ? 1 : [](double p, double a){ return p*p*a; }(pow (a,n/2), n%2 ? a : 1);
}



Это сообщение отредактировал(а) baldina - 10.12.2012, 16:45
PM MAIL   Вверх
bsa
Дата 10.12.2012, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(Zhunko @  10.12.2012,  15:49 Найти цитируемый пост)
Если было нельзя, то от Вас было объяснение почему нельзя.

Понимаешь, до сего момента для меня было очевидно, что люди говорящие подобные вещи знают математику (хотя бы на уровне 6-го класса средней школы).
Сдвиг (самая сложная битовая операция) позволяет умножать/делить число на 2 в целой степени. Т.е. сдвигами можно решить задачу, если A = 2. Остальные битовые операции тут вообще вряд ли помогут.
Перевод в число с плавающей точкой тоже не вариант, так как оно выглядит как мантисса * 2 ^ экспонента. Т.е. опять, с ее помощью можно решить задачу только для A=2 (при этом будет много головной боли при смене архитектуры и/или разрядности).

Сдвигами и сложением можно реализовать умножение. А возведение в целую неотрицательную степень можно реализовать с помощью умножения. Раскрываем скобки и получаем, что возведение в степень можно реализовать через битовые операции и суммирование. НО! Это будет крайне неоптимально. Так как современный процессор делает сдвиг и умножение за одинаковое время, но для реализации 32-х битного умножения нужно сделать 31 сдвиг и столько же сложений.
Можно зайти с другой стороны, и с помощью сдвигов оптимизировать операцию деления на 2, которая используется в индийском варианте решения. Вот только если посмотреть ассемблерный листинг вариантов с делением и со сдвигами, то с большой вероятностью они полностью совпадут, так как компилятор не дурак и знает, что x >> 1 и x / 2 дают одинаковый результат (для целых неотрицательных x).
PM   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0577 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.