| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Составьте программу вычисления степени числа А с н |
| Автор: teac2012 9.12.2012, 17:43 |
| Составьте программу вычисления степени числа А с натуральным показателем n. (записать варианты программы с разными видами циклов while,for) Желательно в turbo c++ 3.0 |
| Автор: Zhunko 9.12.2012, 22:45 | ||
Это конкурс?
|
| Автор: Zhunko 10.12.2012, 00:23 |
Блин! |
| Автор: volatile 10.12.2012, 00:41 |
| Ладно, чтоб совсем уж скучно не было, я оъявляю конкурс. Первому, кто напишет эту функцию, без цыклофф (for,while,do), и одним оператором (без вызова библиотечных функций) +1 в репу. |
| Автор: Zhunko 10.12.2012, 02:33 | ||
Ещё такие циклы умею:
volatile, одним оператором?... Может парой операторов побитовых операций? |
| Автор: math64 10.12.2012, 07:54 | ||
А рекурсию можно?
|
| Автор: feodorv 10.12.2012, 09:35 | ||
Ну да, если не стандартные функции и не циклы, то только рекурсия:
Добавлено через 4 минуты и 8 секунд Для teac2012 пояснение варианта math64: http://coderlife.ru/progr/bystroe-vozvedenie-chisla-v-naturalnuyu-stepen.html. |
| Автор: Zhunko 10.12.2012, 11:13 |
| Индийский алгоритм можно побитовыми операциями сделать в одну строку. |
| Автор: bsa 10.12.2012, 12:59 |
| Zhunko, нука расскажи как? |
| Автор: Zhunko 10.12.2012, 13:37 |
Если вопрос, как или каким образом, то, конечно, путём написания кода. Над реализацией не думал. Наверняка можно, но только для целых чисел. Хотя, можно double с мантиссой преобразовать в int, потом восстановить порядок. |
| Автор: bsa 10.12.2012, 14:37 |
| А зря. Если бы думал, то этих 4-х постов бы не было. |
| Автор: Zhunko 10.12.2012, 14:49 |
Если было нельзя, то от Вас было объяснение почему нельзя. И не было Ваших 2-х постов. Что-то ни у кого одним оператором не получилось. |
| Автор: baldina 10.12.2012, 16:44 | ||
есть operator - оператор, операция. есть statement - оператор, выражение. наверняка volatile имел в виду statement, т.к. одним оператором (operator) действительно нельзя. а если statement - тогда можно, код feodorv. вот еще вариант, быстрое возведение
|
| Автор: bsa 10.12.2012, 17:02 |
Понимаешь, до сего момента для меня было очевидно, что люди говорящие подобные вещи знают математику (хотя бы на уровне 6-го класса средней школы). Сдвиг (самая сложная битовая операция) позволяет умножать/делить число на 2 в целой степени. Т.е. сдвигами можно решить задачу, если A = 2. Остальные битовые операции тут вообще вряд ли помогут. Перевод в число с плавающей точкой тоже не вариант, так как оно выглядит как мантисса * 2 ^ экспонента. Т.е. опять, с ее помощью можно решить задачу только для A=2 (при этом будет много головной боли при смене архитектуры и/или разрядности). Сдвигами и сложением можно реализовать умножение. А возведение в целую неотрицательную степень можно реализовать с помощью умножения. Раскрываем скобки и получаем, что возведение в степень можно реализовать через битовые операции и суммирование. НО! Это будет крайне неоптимально. Так как современный процессор делает сдвиг и умножение за одинаковое время, но для реализации 32-х битного умножения нужно сделать 31 сдвиг и столько же сложений. Можно зайти с другой стороны, и с помощью сдвигов оптимизировать операцию деления на 2, которая используется в индийском варианте решения. Вот только если посмотреть ассемблерный листинг вариантов с делением и со сдвигами, то с большой вероятностью они полностью совпадут, так как компилятор не дурак и знает, что x >> 1 и x / 2 дают одинаковый результат (для целых неотрицательных x). |
| Автор: Dem_max 10.12.2012, 17:03 |
| ТС это приказ ??? |
| Автор: Zhunko 10.12.2012, 17:31 | ||
Вот спасибо! Теперь мне не надо доказывать, что это возможно! Математику совсем не знаю. Тем более не в курсе, что сейчас в 6-ом классе изучают. Может то, что раньше в детском саду? Палочки считают? Как Вы думаете, процессор что-нибудь умеет, кроме побитовых операций? |
| Автор: volatile 10.12.2012, 17:53 | ||||
Да, угадал, светлая башка, практически один в один Вот вчерашний мой вариант:
http://codepad.org/7rA8WEHS (там время поста должно стоять) Спасибо всем кто принял участие. Интересные решения у math64, feodorv, baldina, Плюсики сим товарищам щас поставлю, если получится. (я не из дома, так что если щас не получится, то расставлю сразу как доберусь до своего компа.) |
| Автор: bsa 10.12.2012, 17:53 |
| Zhunko, молодец. давай еще на электронный уровень перейдем: вычисление степени числа путем перевода электронов из одного места в другое. |
| Автор: baldina 10.12.2012, 18:04 | ||
с лямбдой выпендреж, жаль никто не отметил. можно проще (и понятней)
|
| Автор: Zhunko 10.12.2012, 18:27 | ||||
Отметил! Мне понравилось. Хоть, до сих пор не понял, как это работает.
Так оно скоро будет. Типа квантовых компьютеров. Там производительность на 300 порядков выше. |
| Автор: volatile 11.12.2012, 00:22 |
| pow (10, 300) ? а хоть и pow (2, 300) это слишком дофига. Если в ближайшее время изобретут такой комп, первое что будет это глабальный катаклизм. потому-что банковская система рухнет потому-как все ключи будут взломаны за минуты. ну и т.д. |
| Автор: math64 11.12.2012, 07:55 | ||
Можно ещё сделать на шаблонах:
|