tôi đang cố gắng để giải quyết this Project Euler question:Optimize khoản tiền không dồi dào thuật toán
Một số hoàn hảo là một con số mà tổng các ước thích hợp của nó là chính xác bằng số. Ví dụ: tổng số tiền thích hợp là số chia của 28 sẽ là 1 + 2 + 4 + 7 + 14 = 28, có nghĩa là 28 là số hoàn hảo.
Số n được gọi là thiếu nếu tổng số ước của nó là nhỏ hơn n và được gọi là dồi dào nếu tổng này vượt quá n.
Vì 12 là số nhỏ nhất, 1 + 2 + 3 + 4 + 6 = 16, số nhỏ nhất có thể được viết dưới dạng tổng của hai số phong phú là 24. Bằng cách phân tích toán học, nó có thể cho thấy rằng tất cả các số nguyên lớn hơn 28123 có thể được viết dưới dạng tổng của hai số dồi dào. Tuy nhiên, giới hạn trên không thể giảm thêm bằng cách phân tích mặc dù được biết rằng số lớn nhất không thể là được biểu thị bằng tổng của hai số dồi dào nhỏ hơn giới hạn này.
Tìm tổng của tất cả các số nguyên dương không thể được viết là tổng của hai số dồi dào.
Giải pháp của tôi:
#returns a list of the divisors of a given number
def Divs(Number):
Divisors = []
for i in range(2 , int(Number**0.5) + 1):
if Number % i == 0:
Divisors.append(i)
for q in range(len(Divisors)):
if Divisors[q] != (Number/Divisors[q]):
Divisors.append(Number/Divisors[q])
Divisors.insert(0,1)
return Divisors
#returns a list of abundant numbers up to and including the limit
def AbList(limit):
Abundant = []
for i in range(11,limit + 1):
if sum(Divs(i)) > i:
Abundant.append(i)
return Abundant
#Finds the sum of all positive integers that cannot be written as the
#sum of two abundant numbers...
def AbSum(limit):
Abundant = AbList(limit)
NoAbSum = 0
for i in range(1 , limit):
AbSum = 0
x = 0
for x in Abundant:
if i - x in Abundant[:i]:
AbSum = 1
break
if AbSum == 0:
NoAbSum += i
return NoAbSum
này đã xử lý 3,4 GHz của tôi khoảng 15 phút để giải quyết và tôi đang tìm kiếm một cách tốt hơn. Tôi không quan tâm đến hai chức năng đầu tiên vì chúng cùng nhau mất ít hơn một giây để chạy. Hàm thứ ba là kicker ở đây. Nó chạy qua phạm vi số lên tới giới hạn (trong trường hợp này là 20000-cái gì đó), và mỗi lần, nó chạy qua danh sách các số dồi dào, trừ số từ số hiện tại, sau đó kiểm tra câu trả lời đó số. Nếu có một kết quả phù hợp, vòng lặp ngắt và thử lại với số tiếp theo, tất cả các con đường sẽ đạt tới giới hạn.
Tôi biết rằng phải có cách tốt hơn để làm điều này nhưng tôi hơi mới để lập trình. Làm thế nào tôi có thể tăng tốc thuật toán này?
Giải pháp hiện tại của bạn là 'O (m * n)', trong đó 'm' (giới hạn) lớn hơn' n' (số lượng số dồi dào thấp hơn giới hạn). Bây giờ, độ phức tạp của thời gian là gì khi tính toán tất cả các con số * là * tổng số các số dồi dào khác? Điều đó tốt hơn hay tệ hơn giải pháp hiện tại của bạn? –
Tại sao bạn sắp xếp các ước số? –
Khi bạn gửi giải pháp chính xác, bạn sẽ có quyền truy cập vào chuỗi thảo luận cho vấn đề đó, nơi bạn sẽ tìm thấy một số giải pháp hiệu quả nhất. – kefeizhou