逐位计算指数


11

您的任务是按照以下步骤缓慢计算幂运算:

给定两个输入(在此示例中为4和8),您必须通过逐位计算方程来计算幂。您会做的4^8,具有更大的基值(4)和较小的指数(8)。您可以使用更多的幂和除法来执行此操作。您可以将指数除以值X(假设X是指数的质数),然后将基值(B)设为B^X。例如,您可以执行以下操作:

4^8 = (4 ^ 2)^(8 / 2) = 16^4

我在前面的方程式中将X替换为2。

您可以16^4再次通过X = 2以下方式进一步“简化” :

16^4 = (16 ^ 2)^(4 / 2) = 256^2

然后最后计算一个数字(再次是X = 2):

256^2 = (256 ^ 2)^(2 / 2) = 65536^1 = 65536

因此,

4^8 = 16^4 = 256^2 = 65536

这是您应该提供的输出。输出分隔符有点灵活,例如,您可以用换行符或空格代替来分隔方程式=。或者,您可以将它们放入列表中(但不能使用数字或^字符作为分隔符)。

正如马丁·恩德(Martin Ender)所指出的那样,^它也很灵活。例如,您可以在输出中使用[A, B]A**B代替A^B

X可能只是质数,这意味着您不能直接使用X = 8解,并且X的值仅是第二个输入(指数)的质因数。

例子:

(input) -> (output)
4^8 -> 4^8=16^4=256^2=65536
5^11 -> 5^11=48828125
2^15 -> 2^15=32^3=32768 (2^15=8^5=32768 is also a valid output)

请注意,输入格式也是灵活的(例如,您可以采用A \n BA B代替A^B。显然,如果您编写一个带有两个参数的函数,这将不是问题。

在第二个示例中,我们直接进行计算,因为它11是质数,因此无法采取任何其他步骤。

您可以编写程序或函数来解决此问题,并且可以分别打印或返回该值。

因为这是,所以最短的代码获胜!


@JonathanAllan我也在看那个。32^38^15不是512任一。
Yytsi'2

1
@JonathanAllan感谢您发现:)
Okx

@Okx最后一个可以打印为x^1
Rod

@罗德,不行。那太傻了。
Okx

Answers:


2

果冻,16 字节

*Uż:Ṫ
ÆfṪ1;×\ç@€

在线尝试!

输入是一个列表[base, exponent]。下单子链接的返回值是一个列表列表,作为完整程序,该列表的表示形式被打印出来,例如2^15=8^5=32768^1,打印为:

[[2, 15], [8, 5], [32768, 1]]

怎么样?

ÆfṪ1;×\ç@€ - Main link: [base, exponent]            e.g.     [4,12]
Æf         - prime factorization array (vectorises)      [[2,2],[2,2,3]]
  Ṫ        - tail (tailing first costs bytes)                   [2,2,3]
   1;      - 1 concatenated with the result                   [1,2,2,3]
     ×\    - reduce with multiplication  (make factors)       [1,2,4,12]
       ç@€ - call last link (1) as a dyad for €ach with reversed @rguments
           - implicit print if running as a full program

*Uż:Ṫ - Link 1, an entry in the equality: [base, exponent], factor  e.g. [4, 12], 4
*     - exponentiate (vectorises) : [base ^ factor, exponent ^ factor]   [256, 20736]
 U    - upend                                                            [20736, 256]
   :  - integer division: [base // factor, exponent // factor]           [1, 3]
  ż   - zip                                                        [[20736, 1], [256, 3]]
    Ṫ - tail                                                                    [256, 3]
                                               ...i.e at a factor of 4: 4 ^ 12 = 256 ^ 3

它可以通过尾随格式设置为2字节的网格µG,例如:

    2    15
    8     5
32768     1

...或完全格式化,包括^1用尾随的9 修剪掉j€”^j”=ṖṖ,例如:

2^15=8^5=32768

5

JavaScript(ES7),55个字节

f=(a,b,c=2)=>b>1?b%c?f(a,b,c+1):a+['^'+b,f(a**c,b/c)]:a

用于,代替=2^15,8^5,32768)。

测试用例

注意:该代码段用于Math.pow代替**跨浏览器的兼容性。


Firefox 54每晚构建版本100%支持ES7!:o kangax.github.io/compat-table/es2016plus/#firefox54
mbomb007 '17

3

05AB1E23 22 17字节

注意灵活的输出格式,节省了5个字节。

Ò©gƒ²®N¹‚£P`Šm‚Rˆ

在线尝试!

说明

范例 2^15

Ò©                 # calculate primefactors of exponent and store in register
                   # STACK: [3,5]
  g                # length
                   # STACK: 2
   ƒ               # for N in range[0 ... len(primefactors)] do
    ²              # push base
                   # STACK: 2
     ®             # push primefactors
                   # STACK: 2, [3,5]
      N¹‚£         # split into 2 parts where the first is N items long
                   # 1st, 2nd, 3rd iteration: [[], [3, 5]] / [[3], [5]] / [[3, 5], []]
          P        # reduce each by product
                   # STACK 1st iteration: 2, [1,15]
           `       # split list to items on stack
                   # STACK 1st iteration: 2, 1, 15
            Š      # move down the current exponent
                   # STACK 1st iteration: 15, 2, 1
             m     # raise base to the rest of the full exponent
                   # STACK 1st iteration: 15, 2
              ‚    # pair them up
                   # STACK 1st iteration: [15,2]
               R   # reverse the pair
                   # STACK 1st iteration: [2,15]
                ˆ  # store it in global list
                   # print global list at the end of execution

2

C,125 123 + 4(-lm)= 129个 127字节

i;f(n,m)double n;{if(m-1){printf("%.0f^%d=",n,m);for(i=2;i<=m;i++)if(!(m%i))return f(pow(n,i),m/i);}else printf("%.0f",n);}

取一个双精度整数。

在线尝试!


1

Haskell,64个字节

a#b|v:_<-[x|x<-[2..b],mod b x<1]=[a,b]:(a^v)#div b v|1<2=[[a^b]]

用法示例:2 # 32-> [[2,32],[4,16],[16,8],[256,4],[65536,2],[4294967296]]在线尝试!

这个怎么运作:

a#b                       -- take input numbers a and b
   |                      -- if
      [x|x<-[2..b]   ]    --  the list of all x drawn from [2..b]
              ,mod b x<1  --  where x divides b
    v:_<-                 --  has at least one element (bind the first to v)
       = [a,b]:           --  the the result is the [a,b] followed by
          (a^v)#div b v   --  a recursive call with parameters (a^v) and (div b v)
   |1<2                   -- else (i.e. no divisors of b)
       = [[a^b]]          --  the result is the singleton list of a singleton list
                          --    of a^b

0

Bash + GNU实用程序,82

echo $1^$2
f=`factor $2|egrep -o "\S+$"`
((m=$2/f,r=$1**f,m-1))&&$0 $r $m||echo $r

递归外壳脚本。这似乎在TIO中不起作用,但是在保存为脚本并执行后运行良好:

$ ./expbit2.sh 4 8
4^8
16^4
256^2
65536
$ ./expbit2.sh 5 11
5^11
48828125
$ ./expbit2.sh 2 15
2^15
32^3
32768
$ 
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.