Skip to content

Commit b6ea721

Browse files
[pre-commit.ci] auto fixes from pre-commit.com hooks
for more information, see https://pre-commit.ci
1 parent 5d812c9 commit b6ea721

File tree

1 file changed

+33
-33
lines changed

1 file changed

+33
-33
lines changed

maths/perfect_number.py

Lines changed: 33 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -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

145145
def 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

198198
def 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

226226
def 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("\nPerfect 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"\nNumber: {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("\nGoodbye!")
304-
break
304+
break

0 commit comments

Comments
 (0)