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

ตรวจสอบว่าการเปลี่ยนแปลงของ N เท่ากับกำลังของ K ใน Python . หรือไม่


สมมติว่า เรามีจำนวนเต็มบวกสองจำนวน n และ m โดยที่ 2 ≤ n ≤ 1018 และ 2 ≤ m ≤ n เป้าหมายของเราคือหาว่ามีการเรียงสับเปลี่ยนของตัวเลข n ทั้งหมดหรือไม่ เท่ากับยกกำลังหนึ่งของ m หากมี เราจะระบุว่ามีการสับเปลี่ยนตัวเลขทั้งหมดของ n ซึ่งเท่ากับยกกำลังของ m มิฉะนั้น เราจะระบุข้อความสั่งก่อนหน้านี้ว่าเป็นเท็จ

ตัวอย่างเช่น เราได้รับ n =7182 และ m =12 เนื่องจาก 1728 เป็นการเรียงสับเปลี่ยนของตัวเลขทั้งหมดของ 7182 และ 1728 =12^3 เราระบุว่าการเรียงสับเปลี่ยนของตัวเลขทั้งหมดของ n เท่ากับกำลังของ m .

ดังนั้น ถ้าอินพุตเป็น n=7182, m =12; จากนั้นผลลัพธ์จะเป็น "การเรียงสับเปลี่ยนหลักทั้งหมดของ n เท่ากับยกกำลัง m"

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

  • กำหนดฟังก์ชัน check_power() นี่จะใช้เวลา n, m
    • temp_arr_1 :=รายการใหม่
    • temp_arr_2 :=รายการใหม่
    • ในขณะที่ n> 0, ทำ
      • แทรก (n mod 10) ที่ส่วนท้ายของ temp_arr_1
      • n :=ค่าพื้น n / 10
    • ในขณะที่ m> 0, ทำ
      • แทรก (m mod 10) ที่ส่วนท้ายของ temp_arr_2
      • m :=ค่าพื้น m / 10
    • ถ้าชุดใหม่จาก temp_arr_1 เหมือนกับชุดใหม่จาก temp_arr_2 แล้ว
      • คืนค่า True
    • คืนค่าเท็จ
  • จากวิธีหลัก ให้ทำดังนี้ -
  • power_array :=รายการขนาด 100 ใหม่ที่เริ่มต้นด้วย 0
  • max_range :=10^18
  • power_array[0] :=ม
  • ผม :=1
  • ในขณะที่ (power_array[i - 1] * ม.)
  • power_array[i] :=power_array[i - 1] * ม.
  • ผม :=ผม + 1
  • สำหรับ j ในช่วง 0 ถึง i ทำ
    • ถ้า check_power(n, power_array[j]) เป็น True แล้ว
      • ส่งคืน "การเรียงสับเปลี่ยนหลักทั้งหมดของ n เท่ากับยกกำลัง m"
  • ส่งคืน "ไม่มีการเรียงสับเปลี่ยนทั้งหมดของ n เท่ากับยกกำลัง m"
  • ให้เราดูการใช้งานต่อไปนี้เพื่อความเข้าใจที่ดีขึ้น -

    ตัวอย่าง

    def check_power(n, m):
       temp_arr_1 = []
       temp_arr_2 = []
       while (n > 0) :
          temp_arr_1.append(n % 10)
          n //= 10
       while (m > 0) :
          temp_arr_2.append(m % 10)
          m //= 10
       if (set(temp_arr_1) == set(temp_arr_2)):
          return True
       return False
    def solve(n, m):
       power_array = [0] * 100
       max_range = pow(10, 18)
       power_array[0] = m
       i = 1
       while (power_array[i - 1] * m < max_range) :
          power_array[i] = power_array[i - 1] * m
          i += 1
       for j in range(i):
          if (check_power(n, power_array[j])) :
             return "An all digit-permutation of n is equal to a power of m"
       return "No all digit-permutation of n is equal to a power of m"
    n, m = 7182, 12
    print(solve(n, m))

    อินพุต

    7182, 12

    ผลลัพธ์

    An all digit-permutation of n is equal to a power of m