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

ตรวจสอบว่าตัวเลขเป็นตัวเลข Achilles หรือไม่ใน Python


สมมติว่าเรามีตัวเลข n; เราต้องตรวจสอบว่า n เป็นเลขจุดอ่อนหรือไม่ อย่างที่เราทราบกันดีว่าจำนวนหนึ่งคือเลขอคิลลิสเมื่อจำนวนที่มีประสิทธิภาพ (จำนวน N เรียกว่าจำนวนอันทรงพลังเมื่อสำหรับทุกปัจจัยเฉพาะ p ของมัน p^2 ก็หารด้วย) แต่ไม่ใช่กำลังที่สมบูรณ์แบบ ตัวอย่างของตัวเลข Achilles ได้แก่ 72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, 972, 1125

ดังนั้น หากอินพุตเท่ากับ 108 ผลลัพธ์จะเป็น True เนื่องจาก 6 และ 36 หารทั้งคู่และไม่เป็นกำลังสองสมบูรณ์

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

  • กำหนดฟังก์ชัน check_powerful() นี่จะใช้เวลา n
  • ในขณะที่ n mod 2 เหมือนกัน ทำ
    • p :=0
    • ในขณะที่ n mod 2 เหมือนกับ 0, do
      • n :=n / 2
      • p :=p + 1
    • ถ้า p เหมือนกับ 1 แล้ว
      • คืนค่าเท็จ
  • p :=จำนวนเต็มของ (รากที่สองของ n) + 1
  • สำหรับปัจจัยในช่วง 3 ถึง p เพิ่มขึ้น 2 ทำ
    • p :=0
    • ในขณะที่ปัจจัย mod n เหมือนกับ 0, do
      • n :=n / แฟกเตอร์
      • p :=p + 1
    • ถ้า p เหมือนกับ 1 แล้ว
      • คืนค่าเท็จ
  • คืนค่า จริง เมื่อ (n เท่ากับ 1)
  • กำหนดฟังก์ชัน check_power() นี่จะใช้เวลา
  • ถ้า a เหมือนกับ 1 แล้ว
    • คืนค่า True
  • p :=จำนวนเต็มของ (รากที่สองของ n) + 1
  • สำหรับฉันในช่วง 2 ถึง a เพิ่มขึ้น 1 ทำ
    • val :=log(a) / log(i) [ทุกฐาน e]
    • ถ้า (val - ส่วนจำนวนเต็มของ (val)) <0.00000001 แล้ว
      • คืนค่า True
  • คืนค่าเท็จ
  • จากวิธีหลัก ให้ทำดังต่อไปนี้ −
  • ถ้า check_powerful(n) เหมือนกับ True และ check_power(n) เหมือนกับ False ดังนั้น
    • คืนค่า True
  • มิฉะนั้น
    • คืนค่าเท็จ

ตัวอย่าง

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

from math import sqrt, log
def check_powerful(n):
   while (n % 2 == 0):
      p = 0
      while (n % 2 == 0):
         n /= 2
         p += 1
      if (p == 1):
         return False  
   p = int(sqrt(n)) + 1
   for factor in range(3, p, 2):
      p = 0
      while (n % factor == 0):
         n = n / factor
         p += 1
      if (p == 1):
         return False
   return (n == 1)
def check_power(a):
   if (a == 1):
      return True
   p = int(sqrt(a)) + 1
   for i in range(2, a, 1):
      val = log(a) / log(i)
      if ((val - int(val)) < 0.00000001):
         return True
   return False
def isAchilles(n):
   if (check_powerful(n) == True and check_power(n) == False):
      return True
   else:
      return False
n = 108
print(isAchilles(n))

อินพุต

108

ผลลัพธ์

True