Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> Python

แฟกทอเรียลเงอะงะใน Python


ดังที่เราทราบแล้วว่าแฟกทอเรียลของจำนวนเต็มบวก n เป็นผลคูณของจำนวนเต็มบวกทั้งหมดที่น้อยกว่าหรือเท่ากับ n แฟกทอเรียล(10) =10 * 9 * 8 * 7 * 6 * 5 * 4 * 3 * 2 * 1 เราจะพยายามหาแฟกทอเรียลที่เงอะงะ:ใช้จำนวนเต็มในลำดับที่ลดลง เราสลับการดำเนินการคูณสำหรับ a การหมุนคงที่ของการดำเนินการ:คูณ (*), หาร (/), เพิ่ม (+) และลบ (-) ตามลำดับนี้

แฟกทอเรียลที่เงอะงะก็เหมือนเงอะงะ(10) =10 * 9 / 8 + 7 - 6 * 5 / 4 + 3 - 2 * 1 อย่างไรก็ตาม การดำเนินการเหล่านี้ยังคงใช้ลำดับการดำเนินการทางคณิตศาสตร์ตามปกติ:เราทำการคูณทั้งหมด และขั้นตอนการหารก่อนขั้นตอนการบวกหรือการลบใดๆ และขั้นตอนการคูณและการหารจะถูกประมวลผลจากซ้ายไปขวา การหารที่เราใช้คือการแบ่งพื้น โดย 10 * 9 / 8 เท่ากับ 11 ซึ่งรับประกันว่าผลลัพธ์จะเป็นจำนวนเต็ม

ตัวอย่างเช่น หากอินพุตคือ 10 ผลลัพธ์จะเป็น 12 เช่น 12 =10 * 9 / 8 + 7 – 6 * 5 / 4 + 3 – 2 * 1

เพื่อแก้ปัญหานี้ เราจะทำตามขั้นตอนเหล่านี้ -

  • กำหนดโอเปอเรชั่นอาร์เรย์ และจัดเก็บโอเปอเรเตอร์ [* / + -] สร้างสแต็กว่างหนึ่งสแต็ก แล้วดัน N เข้าไปในสแต็ก
  • ดัชนี :=0
  • ลด N ทีละ 1
  • ในขณะที่ N ไม่ใช่ 0:
    • ถ้า operation[index] =* แล้ว
      • หากองค์ประกอบบนสุดของสแต็กคือ>=0 ให้อัปเดตองค์ประกอบบนสุดของสแต็กเป็น top_element :=N * top_element
      • มิฉะนั้น stack top element :=-1 * |N * stack top element|
    • อย่างอื่นถ้า operation[index] คือ / แล้ว
      • หากองค์ประกอบด้านบนของสแต็กคือ>=0 ให้อัปเดตองค์ประกอบด้านบนของสแต็กเป็น top_element :=top_element / N
      • มิฉะนั้น stack top element :=-1 * |stack top element / N|
    • มิฉะนั้น ถ้า operation[index] คือ + แล้ว
      • แทรก N ลงในสแต็ก
    • อย่างอื่นแทรก (-1 * N) ลงในกอง
    • index :=(index + 1) mod length of operation array
    • ลด N ทีละ 1
  • ส่งคืนผลรวมขององค์ประกอบสแต็ก

ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

ตัวอย่าง

class Solution(object):
   def clumsy(self, N):
      operations = ["*","/","+","-"]
      stack = []
      index = 0
      stack.append(N)
      N-=1
      while N:
         if operations[index] == "*":
            if stack[-1]>=0:
               stack[-1] *=N
            else:
               stack[-1] = -1*(abs(stack[-1])*N)
         elif operations[index] == "/":
            if stack[-1]>=0:
               stack[-1] //=N
            else:
               stack[-1] = -1*(abs(stack[-1])//N)
         elif operations[index] == "+":
            stack.append(N)
         else:
            stack.append(-1*N)
         index = (index+1) % len(operations)
         N-=1
      return sum(stack)
ob = Solution()
print(ob.clumsy(10))

อินพุต

10

ผลลัพธ์

12