Codegolf — Возведение Натуральных Чисел В Степень С Использованием Только Примитивных Целочисленных Операций.

  • Автор темы Oleg19100
  • Обновлено
  • 22, Oct 2024
  • #1
На этот вопрос уже есть ответы здесь:

Реализуйте гипервозведение в степень/тетрацию без использования '^' [закрыто] pow() function (exponentiation) for natural numbers, in a language of your choosing, using only , (47 ответов) Закрыт 6 лет назад., Задача Реализуйте C-эквивалент добавлениевычитание

(который включает в себя отрицание и сравнения), сдвиг битовлогические операции

на подписанных и/или неподписанных

целые числа

и, конечно, цикл. (Обратите внимание, что это отличается от гипервозведение в степень/тетрация , что является повторным возведением в степень. Это всего лишь одно применение возведения в степень, которое можно математически выразить как многократное умножение.) Это задача по кодовому гольфу, поэтому самый короткий ответ — король. Входные предположения Вы выполняете вычисления х поднят до

й

власть. Вы можете предположить, что х ≥ 1 и

й

≥ 1, поскольку 0 не является натуральным числом. (Другими словами, вам не обязательно проверять 0⁰.)

Выход

Oleg19100


Рег
23 Sep, 2008

Тем
66

Постов
191

Баллов
531
  • 26, Oct 2024
  • #2

Ява, 84

Скучный метод «сложения в двойном цикле». Один цикл предназначен для умножения, другой делает это более одного раза. Работает до переполнения

 
 
 
 
 
 
 
 
 
 
 
 
 
 PS E:\> .\pow.ps1 10076.45 77
1.79755288402548E+308
PS E:\> .\pow.ps1 2 10
1024
PS E:\> .\pow.ps1 10 100
1E+100
PS E:\> .\pow.ps1 4 20
1099511627776
PS E:\> .\pow.ps1 20 4
160000
PS E:\> .\pow.ps1 10077 77
Infinity
 
types. The -10 bonus just isn't worth it in Java ;)

$p=[string]$args[0]+"*";powershell($p*$args[1]+"1") ||answer||

CJam, 21 байт

:\>cat pow.ps1 filter m([double]$a,$b){$r=0;while($b--){$r+=$a};return $r} filter p([double]$c,$d){$s=1;while($d--){$s=m $s $c};return $s} :\>cat pow.ps1 | wc --chars 124 :\>runpow.bat :\>powershell -nologo -noexit -c "& {. .\pow.ps1; p 3 4;p 2 10; p 10000 77; p 10000 78}" 81 1024 1.0000000000004E+308 Infinity <------- if result above [double]::MaxValue

Использует только манипуляции со стеком, циклы и сложение.

Попробуйте онлайн.

 

DashaBree


Рег
28 Jun, 2020

Тем
83

Постов
202

Баллов
647
  • 26, Oct 2024
  • #3

CJam, 22 байта

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

1

Попробуйте онлайн.

 

Vasyaa


Рег
26 Oct, 2008

Тем
78

Постов
198

Баллов
598
  • 26, Oct 2024
  • #4

Элемент, 18 байт

p(0, 0)

Это простое решение с двойным контуром. Он использует только сложение и простые операции стека. (Я еще не закончил играть в гольф).

Ввод похож на

1000

для 10*1000 giving m(10, 1000) .

Вот очень похожее 18-байтовое решение:

p(10, 4) ||answer||

Пиф, 27 байт

6561

Работает путем сложения чисел во время цикла. Принимает ввод в форме:

p(9, 4)

Попробуйте это здесь.

 

Michaelangello


Рег
26 Mar, 2004

Тем
77

Постов
216

Баллов
641
  • 26, Oct 2024
  • #5

Хаскель, 37 байт

1000

Пример использования (обратите внимание: сначала идет показатель степени, затем основание):

m=lambda x,y:y and x+m(x,y-1);p=lambda x,y:y<1or m(x,p(x,y-1)) ||answer||

Питон 2, 67 62 байта

Prelude> ((foldl1((sum.).replicate).).replicate) 5 2 32 Prelude> ((foldl1((sum.).replicate).).replicate) 6 3 729

Это очевидное решение: определить умножение через сложение, а затем возведение в степень через умножение.

К сожалению, эта довольно наивная реализация очень быстро достигает максимальной глубины рекурсии (максимальная глубина Python по умолчанию равна (foldl1((sum.).replicate).).replicate , I think). For instance, you can do x,y и он сразу выводит K1Vr0@Q1J0Vr0@Q0=J+JK)=KJ)K . But if you try 1_'_'["#[2:'+"]']` оно задыхается, потому что в конечном итоге ему приходится оценивать 125 (that is, 5^3 ) и это занимает 5 3 nested additions to do it.

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

Кстати, 1__'['[2:'+"]#"]#` returns {:X({:BX(F0\{B+}*}&}:F , что, на мой взгляд, является желательным поведением (если интересно, посмотрите мой ответ и прокомментируйте здесь: https://math.stackexchange.com/questions/20969/prove-0-1-from-first-principles/1094926#1094926).

Огромное спасибо xnor за то, что сэкономили мне 5 байт!

 

Qqqq


Рег
13 Aug, 2007

Тем
84

Постов
195

Баллов
665
  • 26, Oct 2024
  • #6

Powershell — 124 байта

{1@@,f{;0@@,f{;+}~}~}

PowerShell 51 байт

(ответ перед редактированием объединяет множимую строку и оценивает ее)

int p(int x,int y){int r=1,p,i=0,j;for(;i++<y;r=p)for(p=0,j=0;j++<x;)p+=r;return r;}

результат

int
 

Kildepsleedo


Рег
26 Mar, 2014

Тем
73

Постов
168

Баллов
543
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно