68 lines
1.6 KiB
Python
68 lines
1.6 KiB
Python
"""
|
||
n! means `n! = n × (n-1) × ... 2 × 1`.
|
||
For example, 10! = 10 × 9 × ... × 2 × 1 = 3628800,
|
||
and the sum of the digits in the number 10! is 3 + 6 + 2 + 8 + 8 + 0 + 0 = 27 .
|
||
|
||
Find the sum of the digits in the number 100!.
|
||
"""
|
||
|
||
import math
|
||
import time
|
||
from functools import reduce
|
||
|
||
|
||
def timer(func):
|
||
def wrapper(*args, **kwargs):
|
||
start_time = time.time()
|
||
result = func(*args, **kwargs)
|
||
end_time = time.time()
|
||
print(f"Execution time: {end_time - start_time:.8f} seconds")
|
||
return result
|
||
|
||
return wrapper
|
||
|
||
|
||
def large_multiplication(a: str, b: str) -> str:
|
||
result = [0] * (len(a) + len(b))
|
||
for i in range(len(a) - 1, -1, -1):
|
||
carry = 0
|
||
for j in range(len(b) - 1, -1, -1):
|
||
product = int(a[i]) * int(b[j]) + result[i + j + 1] + carry
|
||
result[i + j + 1] = product % 10
|
||
carry = product // 10
|
||
result[i] += carry
|
||
return "".join(map(str, result)).lstrip("0") or "0"
|
||
|
||
|
||
def factorial(n: int) -> int:
|
||
res = reduce(lambda x, y: x * y, range(1, n + 1))
|
||
return res
|
||
|
||
|
||
@timer
|
||
def factorial_digit_sum(n: int) -> int:
|
||
if n >= 1000:
|
||
fact = math.factorial(n)
|
||
else:
|
||
fact = factorial(n)
|
||
return sum(int(digit) for digit in str(fact))
|
||
|
||
|
||
@timer
|
||
def large_factorial(n: int) -> int:
|
||
result = "1"
|
||
for i in range(2, n + 1):
|
||
result = large_multiplication(result, str(i))
|
||
print(f"{n}!={result}")
|
||
sum_all = sum(int(digit) for digit in result)
|
||
return sum_all
|
||
|
||
|
||
def main():
|
||
print(factorial_digit_sum(100))
|
||
print(large_factorial(100))
|
||
|
||
|
||
if __name__ == "__main__":
|
||
main()
|