@@ -126,38 +126,38 @@ def perfect(number: int) -> bool:
126126 """
127127 if not isinstance (number , int ):
128128 raise ValueError ("number must be an integer" )
129-
129+
130130 if number <= 0 :
131131 return False
132-
132+
133133 # Special case: 1 has no proper divisors
134134 if number == 1 :
135135 return False
136-
136+
137137 # Find sum of all proper divisors
138138 # We only need to check up to number//2 since no proper divisor
139139 # can be greater than half the number
140140 divisor_sum = sum (i for i in range (1 , number // 2 + 1 ) if number % i == 0 )
141-
141+
142142 return divisor_sum == number
143143
144144
145145def perfect_optimized (number : int ) -> bool :
146146 """
147147 Optimized version of perfect number checker using mathematical properties.
148-
148+
149149 This version uses the fact that divisors come in pairs (d, n/d) to reduce
150150 the search space to sqrt(n).
151-
151+
152152 Time Complexity: O(sqrt(n))
153153 Space Complexity: O(1)
154-
154+
155155 Args:
156156 number: The positive integer to be checked.
157-
157+
158158 Returns:
159159 True if the number is a perfect number, False otherwise.
160-
160+
161161 Examples:
162162 >>> perfect_optimized(6)
163163 True
@@ -176,12 +176,12 @@ def perfect_optimized(number: int) -> bool:
176176 """
177177 if not isinstance (number , int ):
178178 raise ValueError ("number must be an integer" )
179-
179+
180180 if number <= 1 :
181181 return False
182-
182+
183183 divisor_sum = 1 # 1 is always a proper divisor for n > 1
184-
184+
185185 # Check divisors up to sqrt(number)
186186 i = 2
187187 while i * i <= number :
@@ -191,20 +191,20 @@ def perfect_optimized(number: int) -> bool:
191191 if i != number // i :
192192 divisor_sum += number // i
193193 i += 1
194-
194+
195195 return divisor_sum == number
196196
197197
198198def find_perfect_numbers (limit : int ) -> list [int ]:
199199 """
200200 Find all perfect numbers up to a given limit.
201-
201+
202202 Args:
203203 limit: The upper bound to search for perfect numbers.
204-
204+
205205 Returns:
206206 List of perfect numbers up to the limit.
207-
207+
208208 Examples:
209209 >>> find_perfect_numbers(10)
210210 [6]
@@ -219,20 +219,20 @@ def find_perfect_numbers(limit: int) -> list[int]:
219219 """
220220 if not isinstance (limit , int ) or limit < 0 :
221221 raise ValueError ("limit must be a non-negative integer" )
222-
222+
223223 return [n for n in range (1 , limit + 1 ) if perfect (n )]
224224
225225
226226def get_divisors (number : int ) -> list [int ]:
227227 """
228228 Get all proper divisors of a number (excluding the number itself).
229-
229+
230230 Args:
231231 number: The positive integer to find divisors for.
232-
232+
233233 Returns:
234234 List of proper divisors in ascending order.
235-
235+
236236 Examples:
237237 >>> get_divisors(6)
238238 [1, 2, 3]
@@ -247,10 +247,10 @@ def get_divisors(number: int) -> list[int]:
247247 """
248248 if not isinstance (number , int ) or number <= 0 :
249249 raise ValueError ("number must be a positive integer" )
250-
250+
251251 if number == 1 :
252252 return []
253-
253+
254254 return [i for i in range (1 , number // 2 + 1 ) if number % i == 0 ]
255255
256256
@@ -259,46 +259,46 @@ def get_divisors(number: int) -> list[int]:
259259
260260 print ("Running doctests..." )
261261 testmod (verbose = True )
262-
262+
263263 print ("\n Perfect Number Checker" )
264264 print ("=" * 40 )
265265 print ("A perfect number equals the sum of its proper divisors." )
266266 print ("Examples: 6 (1+2+3), 28 (1+2+4+7+14), 496, 8128, ..." )
267267 print ()
268-
268+
269269 while True :
270270 try :
271271 user_input = input ("Enter a positive integer (or 'q' to quit): " ).strip ()
272- if user_input .lower () == 'q' :
272+ if user_input .lower () == "q" :
273273 break
274-
274+
275275 number = int (user_input )
276-
276+
277277 if number <= 0 :
278278 print ("Please enter a positive integer." )
279279 continue
280-
280+
281281 is_perfect = perfect (number )
282282 divisors = get_divisors (number )
283283 divisor_sum = sum (divisors )
284-
284+
285285 print (f"\n Number: { number } " )
286286 print (f"Proper divisors: { divisors } " )
287287 print (f"Sum of divisors: { divisor_sum } " )
288288 print (f"Is perfect: { 'Yes' if is_perfect else 'No' } " )
289-
289+
290290 if is_perfect :
291291 print (f"✓ { number } is a Perfect Number!" )
292292 else :
293293 print (f"✗ { number } is not a Perfect Number." )
294-
294+
295295 print ("-" * 40 )
296-
296+
297297 except ValueError as e :
298298 if "invalid literal" in str (e ):
299299 print ("Please enter a valid integer." )
300300 else :
301301 print (f"Error: { e } " )
302302 except KeyboardInterrupt :
303303 print ("\n Goodbye!" )
304- break
304+ break
0 commit comments