Hitung Eksponen sedikit demi sedikit


11

Tugas Anda adalah menghitung eksponensial secara perlahan, dengan langkah-langkah berikut:

Diberikan dua input (dalam contoh ini, 4 dan 8), Anda harus menghitung eksponensial dengan menghitung persamaan sedikit demi sedikit. Anda akan melakukannya 4^8, memiliki nilai dasar yang lebih besar (4) dan eksponen yang lebih kecil (8). Anda dapat melakukan ini menggunakan lebih banyak eksponensial dan pembagian. Anda dapat membagi eksponen dengan nilai X (asalkan X adalah pembagi utama eksponen), dan jadikan nilai dasar ( B ) menjadi B^X. Misalnya, Anda dapat melakukan:

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

Saya telah mengganti X dengan 2 pada persamaan sebelumnya.

Anda dapat 'menyederhanakan' 16^4lebih lanjut, lagi dengan X = 2:

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

Dan akhirnya menghitung angka (sekali lagi, X = 2):

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

Karena itu,

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

Ini adalah output yang harus Anda berikan. Pemisah output sedikit fleksibel, misalnya, Anda dapat memisahkan persamaan dengan baris baru atau spasi, bukan =. Atau, Anda dapat memasukkannya ke dalam daftar (tetapi Anda tidak boleh menggunakan angka atau ^karakter sebagai pemisah).

Seperti yang ditunjukkan Martin Ender, ^ini juga fleksibel. Misalnya, Anda dapat menggunakan [A, B]atau A**Bbukannya A^Bdalam output.

X mungkin hanya prima, yang berarti Anda tidak dapat menggunakan X = 8untuk langsung ke solusi, dan nilai-nilai X hanya akan menjadi faktor prima dari input kedua (eksponen).

Contoh:

(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)

Perlu diingat bahwa format input juga fleksibel (mis. Anda dapat mengambil A \n Batau A Balih-alih A^B. Jelas, ini tidak akan menjadi masalah jika Anda menulis fungsi dengan mengambil dua argumen.

Pada contoh kedua, kita langsung menuju perhitungan, karena 11ini prima dan kita tidak bisa mengambil langkah lagi.

Anda dapat menulis program atau fungsi untuk menyelesaikannya, dan Anda dapat mencetak atau mengembalikan nilainya masing-masing.

Karena ini adalah , kode terpendek itu menang!


@ Jonathan Allan aku juga melihatnya. 32^3dan 8^15juga tidak 512.
Yytsi

1
@JonathanAllan terima kasih telah melihat itu :)
Okx

@ OKx yang terakhir dapat dicetak x^1?
Rod

@Rod tidak, tidak bisa. Itu akan konyol.
Okx

Jawaban:


2

Jelly , 16 byte

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

Cobalah online!

Input adalah daftar tunggal [base, exponent]. Nilai balik dari tautan monadik bawah adalah daftar daftar, karena program lengkap representasi dari daftar itu dicetak, misalnya 2^15=8^5=32768^1dicetak sebagai:

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

Bagaimana?

Æ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

Itu bisa diformat sebagai kisi untuk 2 byte oleh trailing µG, misalnya:

    2    15
    8     5
32768     1

... atau sepenuhnya diformat, termasuk memotong ^1, untuk 9, dengan trailing j€”^j”=ṖṖ, misalnya:

2^15=8^5=32768

5

JavaScript (ES7), 55 byte

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

Digunakan ,di tempat =( 2^15,8^5,32768).

Uji kasus

Catatan: snippet use Math.powbukan **untuk kompatibilitas lintas-browser.


Firefox 54 build malam mendukung ES7 100%! : O kangax.github.io/compat-table/es2016plus/#firefox54
mbomb007

3

05AB1E , 23 22 17 byte

Disimpan 5 byte dengan memperhatikan format output yang fleksibel.

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

Cobalah online!

Penjelasan

Contoh untuk 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 byte

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);}

Membawa bilangan ganda dan bilangan bulat.

Cobalah online!


1

Haskell, 64 byte

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

Contoh penggunaan: 2 # 32-> [[2,32],[4,16],[16,8],[256,4],[65536,2],[4294967296]]. Cobalah online! .

Bagaimana itu bekerja:

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

Utilitas 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

Script shell rekursif. Tampaknya ini tidak berfungsi di TIO, tetapi berjalan dengan baik ketika disimpan sebagai skrip dan dijalankan:

$ ./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
$ 
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.