@@ -126,38 +126,38 @@ def perfect(number: int) -> bool:
126
126
"""
127
127
if not isinstance (number , int ):
128
128
raise ValueError ("number must be an integer" )
129
-
129
+
130
130
if number <= 0 :
131
131
return False
132
-
132
+
133
133
# Special case: 1 has no proper divisors
134
134
if number == 1 :
135
135
return False
136
-
136
+
137
137
# Find sum of all proper divisors
138
138
# We only need to check up to number//2 since no proper divisor
139
139
# can be greater than half the number
140
140
divisor_sum = sum (i for i in range (1 , number // 2 + 1 ) if number % i == 0 )
141
-
141
+
142
142
return divisor_sum == number
143
143
144
144
145
145
def perfect_optimized (number : int ) -> bool :
146
146
"""
147
147
Optimized version of perfect number checker using mathematical properties.
148
-
148
+
149
149
This version uses the fact that divisors come in pairs (d, n/d) to reduce
150
150
the search space to sqrt(n).
151
-
151
+
152
152
Time Complexity: O(sqrt(n))
153
153
Space Complexity: O(1)
154
-
154
+
155
155
Args:
156
156
number: The positive integer to be checked.
157
-
157
+
158
158
Returns:
159
159
True if the number is a perfect number, False otherwise.
160
-
160
+
161
161
Examples:
162
162
>>> perfect_optimized(6)
163
163
True
@@ -176,12 +176,12 @@ def perfect_optimized(number: int) -> bool:
176
176
"""
177
177
if not isinstance (number , int ):
178
178
raise ValueError ("number must be an integer" )
179
-
179
+
180
180
if number <= 1 :
181
181
return False
182
-
182
+
183
183
divisor_sum = 1 # 1 is always a proper divisor for n > 1
184
-
184
+
185
185
# Check divisors up to sqrt(number)
186
186
i = 2
187
187
while i * i <= number :
@@ -191,20 +191,20 @@ def perfect_optimized(number: int) -> bool:
191
191
if i != number // i :
192
192
divisor_sum += number // i
193
193
i += 1
194
-
194
+
195
195
return divisor_sum == number
196
196
197
197
198
198
def find_perfect_numbers (limit : int ) -> list [int ]:
199
199
"""
200
200
Find all perfect numbers up to a given limit.
201
-
201
+
202
202
Args:
203
203
limit: The upper bound to search for perfect numbers.
204
-
204
+
205
205
Returns:
206
206
List of perfect numbers up to the limit.
207
-
207
+
208
208
Examples:
209
209
>>> find_perfect_numbers(10)
210
210
[6]
@@ -219,20 +219,20 @@ def find_perfect_numbers(limit: int) -> list[int]:
219
219
"""
220
220
if not isinstance (limit , int ) or limit < 0 :
221
221
raise ValueError ("limit must be a non-negative integer" )
222
-
222
+
223
223
return [n for n in range (1 , limit + 1 ) if perfect (n )]
224
224
225
225
226
226
def get_divisors (number : int ) -> list [int ]:
227
227
"""
228
228
Get all proper divisors of a number (excluding the number itself).
229
-
229
+
230
230
Args:
231
231
number: The positive integer to find divisors for.
232
-
232
+
233
233
Returns:
234
234
List of proper divisors in ascending order.
235
-
235
+
236
236
Examples:
237
237
>>> get_divisors(6)
238
238
[1, 2, 3]
@@ -247,10 +247,10 @@ def get_divisors(number: int) -> list[int]:
247
247
"""
248
248
if not isinstance (number , int ) or number <= 0 :
249
249
raise ValueError ("number must be a positive integer" )
250
-
250
+
251
251
if number == 1 :
252
252
return []
253
-
253
+
254
254
return [i for i in range (1 , number // 2 + 1 ) if number % i == 0 ]
255
255
256
256
@@ -259,46 +259,46 @@ def get_divisors(number: int) -> list[int]:
259
259
260
260
print ("Running doctests..." )
261
261
testmod (verbose = True )
262
-
262
+
263
263
print ("\n Perfect Number Checker" )
264
264
print ("=" * 40 )
265
265
print ("A perfect number equals the sum of its proper divisors." )
266
266
print ("Examples: 6 (1+2+3), 28 (1+2+4+7+14), 496, 8128, ..." )
267
267
print ()
268
-
268
+
269
269
while True :
270
270
try :
271
271
user_input = input ("Enter a positive integer (or 'q' to quit): " ).strip ()
272
- if user_input .lower () == 'q' :
272
+ if user_input .lower () == "q" :
273
273
break
274
-
274
+
275
275
number = int (user_input )
276
-
276
+
277
277
if number <= 0 :
278
278
print ("Please enter a positive integer." )
279
279
continue
280
-
280
+
281
281
is_perfect = perfect (number )
282
282
divisors = get_divisors (number )
283
283
divisor_sum = sum (divisors )
284
-
284
+
285
285
print (f"\n Number: { number } " )
286
286
print (f"Proper divisors: { divisors } " )
287
287
print (f"Sum of divisors: { divisor_sum } " )
288
288
print (f"Is perfect: { 'Yes' if is_perfect else 'No' } " )
289
-
289
+
290
290
if is_perfect :
291
291
print (f"✓ { number } is a Perfect Number!" )
292
292
else :
293
293
print (f"✗ { number } is not a Perfect Number." )
294
-
294
+
295
295
print ("-" * 40 )
296
-
296
+
297
297
except ValueError as e :
298
298
if "invalid literal" in str (e ):
299
299
print ("Please enter a valid integer." )
300
300
else :
301
301
print (f"Error: { e } " )
302
302
except KeyboardInterrupt :
303
303
print ("\n Goodbye!" )
304
- break
304
+ break
0 commit comments