मान लीजिए हमारे पास एक संख्या n है; हमें जांचना है कि क्या n एक अकिलीस संख्या है या नहीं। जैसा कि हम जानते हैं, एक संख्या अकिलीस संख्या होती है जब वह शक्तिशाली (एक संख्या N को पावरफुल नंबर कहा जाता है जब इसके हर अभाज्य गुणक p के लिए, p^2 भी इसे विभाजित करता है) लेकिन पूर्ण घात नहीं होती। अकिलीस संख्याओं के कुछ उदाहरण हैं: 72, 108, 200, 288, 392, 432, 500, 648, 675, 800, 864, 968, 972, 1125।
यदि इनपुट 108 जैसा है, तो आउटपुट True होगा, क्योंकि 6 और 36 दोनों इसे विभाजित करते हैं और यह पूर्ण वर्ग नहीं है।
इसे हल करने के लिए हम निम्नलिखित चरणों का पालन करेंगे:
- check_powerful() नामक एक फंक्शन परिभाषित करें। यह n लेगा:
- जब तक n % 2 == 0, करें:
- p := 0
- जब तक n % 2 == 0, करें: n := n / 2, p := p + 1
- यदि p == 1, तो False लौटाएं
- p := int(sqrt(n)) + 1
- factor को 3 से p तक 2 बढ़ाकर, करें:
- p := 0
- जब तक n % factor == 0, करें: n := n / factor, p := p + 1
- यदि p == 1, तो False लौटाएं
- n == 1 होने पर true लौटाएं
- जब तक n % 2 == 0, करें:
- check_power() नामक एक फंक्शन परिभाषित करें। यह a लेगा:
- यदि a == 1, तो True लौटाएं
- p := int(sqrt(a)) + 1
- i को 2 से a तक 1 बढ़ाकर, करें:
- val := log(a) / log(i) [सभी आधार e]
- यदि (val - int(val)) < 0.00000001, तो True लौटाएं
- False लौटाएं
- मुख्य मेथड से, निम्नलिखित करें:
- यदि check_powerful(n) == True और check_power(n) == False, तो True लौटाएं
- अन्यथा, False लौटाएं
उदाहरण
बेहतर समझ के लिए निम्नलिखित कार्यान्वयन देखें:
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