Đối với bất kỳ N nào, hãy f (N) là năm cuối cùng chữ số trước dấu 0 ở số N !. Ví dụ,Project Euler - Sự cố 160
9! = 362880 so f(9)=36288 10! = 3628800 so f(10)=36288 20! = 2432902008176640000 so f(20)=17664
Tìm f (1.000.000.000.000)
Tôi đã giải quyết thành công vấn đề này cho các ví dụ được đưa ra, chức năng của mình một cách chính xác có thể tìm thấy f (9), f (10), vv Tuy nhiên nó đấu tranh với số lượng lớn hơn, đặc biệt là số vấn đề yêu cầu - f (10^12).
Tối ưu hóa hiện tại của tôi như sau: Tôi xóa số không theo sau khỏi hệ số và tổng, và rút ngắn tổng thành 5 chữ số sau mỗi phép nhân. Mã trong python như sau:
def SFTR (n):
sum, a = 1, 2
while a < n+1:
mul = int(re.sub("0+$","",str(a)))
sum *= mul
sum = int(re.sub("0+$","",str(sum))[-5:])
a += 1
return sum
Bất cứ ai có thể cho tôi biết lý do tại sao chức năng này được mở rộng quá nhiều và lý do mất quá nhiều thời gian. Ngoài ra, nếu có ai có thể gợi ý cho tôi theo hướng đúng để tối ưu hóa thuật toán của tôi. (tên của chủ đề chung sẽ đủ) Cảm ơn bạn.
Cập nhật:
Tôi đã thực hiện một số thay đổi để tối ưu hóa và nó là nhanh hơn đáng kể, nhưng nó vẫn không đủ nhanh cho f (10^12). Bất cứ ai có thể cho tôi biết whats làm cho mã của tôi chậm hoặc làm thế nào để làm cho nó nhanh hơn?
def SFTR (n):
sum, a = 1, 2
while a < n+1:
mul = a
while(mul % 10 == 0): mul = mul/10
mul = mul % 100000
sum *= mul
while(sum % 10 == 0): sum = sum/10
sum = sum % 100000
a += 1
return sum
10^12 là một số lớn. Trên một máy tính bình thường, bạn không thể thực hiện 10^12 hoạt động trong một phút. – starblue