คำนวณเอ็กซ์โปเนนต์ทีละบิต


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

นี่คือผลลัพธ์ที่คุณควรให้ =คั่นเอาท์พุทที่มีความยืดหยุ่นเล็กน้อยตัวอย่างเช่นคุณสามารถแยกสมการโดยการขึ้นบรรทัดใหม่หรือช่องว่างแทน หรือคุณอาจใส่ไว้ในรายการ (แต่คุณต้องไม่ใช้ตัวเลขหรือ^ตัวอักษรเป็นตัวคั่น)

ในขณะที่มาร์ตินเอนเดอร์ชี้ให้เห็น^ความยืดหยุ่นก็เช่นกัน ตัวอย่างเช่นคุณอาจจะใช้[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 BหรือA Bแทนที่จะA^Bเห็นได้ชัดว่านี่จะไม่เป็นปัญหาหากคุณเขียนฟังก์ชั่นโดยใช้อาร์กิวเมนต์สองตัว

ในตัวอย่างที่สองเราตรงไปที่การคำนวณเนื่องจาก11เป็นส่วนสำคัญและเราไม่สามารถทำตามขั้นตอนเพิ่มเติมได้

คุณอาจจะเขียนโปรแกรมหรือฟังก์ชั่นเพื่อแก้ปัญหานี้และคุณอาจพิมพ์หรือคืนค่าตามลำดับ

เช่นนี้เป็นรหัสที่สั้นที่สุดชนะ!


@JanathanAllan ฉันก็มองไปที่นั้น 32^3และ8^15ไม่ใช่ 512 เช่นกัน
Yytsi

1
ขอบคุณ @JonathanAllan สำหรับการจำว่า :)
Okx

@Okx คนสุดท้ายสามารถพิมพ์เป็นx^1?
ร็อด

@ เร็วไม่ได้ นั่นจะไร้สาระ
Okx

คำตอบ:


2

เยลลี่ขนาด 16 ไบต์

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

ลองออนไลน์!

[base, exponent]การป้อนข้อมูลเป็นรายการเดียว ค่าส่งคืนของลิงค์ monadic ที่ต่ำกว่าคือรายการของรายการเนื่องจากโปรแกรมเต็มรูปแบบการแสดงรายการนั้นจะถูกพิมพ์ตัวอย่างเช่น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

... หรือฟอร์แมตเต็มรูปแบบรวมถึงการตัดส่วนที่^19 ด้วยการต่อท้าย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 สร้างต่อคืนรองรับ ES7 100%! : O kangax.github.io/compat-table/es2016plus/#firefox54
mbomb007

3

05AB1E , 23 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


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
$ 
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.