Originally posted by 11520126
View Post
Originally posted by 11520673
View Post
Nằm trong khuôn khổ chiến dịch PR thô bạo cho mã nguồn mở nên code sẽ được viết bằng python, giải thuật thiết kế theo nguyên tắc tham lam nên chắc nó còn hơi ngu ngu nhưng mà kệ, viết giải trí mà, ai thấy chỗ sai chỉ ra giùm chứ đừng nói lời cay đắng.
Đã test với số n = 5 chục ngàn, chạy mất khoản 4MiB ram thời gian khoảng vài phút tính toán sau đó mất vài chục phút để xuất hết kết quả ra màn hình =))
Thuật toán có độ phức tạp có lẽ là nằm đâu đó giữa n^2 với n^3 (làm biếng tính quá) nên nếu 50.000 mà chạy vài phút thì nếu chờ vài tiếng có thể tăng nó lên 60 căn hai là 7 lần nữa, nhưng mà khuya rồi
Ai có thắc mắc về python xin mời ghé đại bản doanh box mã nguồn mở: http://forum.uit.edu.vn/forums/57-Lop-ma-nguon-mo
Hoặc ghé văn phòng tụ tập đập phá: http://forum.uit.edu.vn/threads/1931...a-se-thu-linux
Code:
import math n = 46 print "Nhap n " n = int(raw_input()) def prime_list(n): result = range(2,n) i = 0 b = math.sqrt(n) while i < len(result) and result[i] < b : # print result[i] a = 2 * result[i] j = i + 1 while j < len(result): # print 'a = ' + str(a) if (result[j] == a): # print 'pop ' , result[j] result.pop(j) a += result[i] elif (result[j] > a): a += result[i] j += 1 i += 1 return result print prime_list(n) pl = prime_list(n) min_number = len(pl) cur_number = -1 a = 0 while (len(pl) > 0 and (cur_number == -1 or cur_number <= min_number)): #init value backup = pl[:] #clone array result = [] #define blank array while (a < n and len(backup) > 0): if (a + backup[-1] <= n): a += backup[-1] result.append(backup[-1]) else: backup.pop() cur_number = len(result) if (a == n and cur_number <= min_number): print "result: ", result min_number = min( cur_number, min_number) else: cur_number = 0 pass #reset value a = 0 pl.pop() #decree the list after each result found, so that next result will be different
1st revision: Hàm tìm số nguyên tố sai. Đã update
Comment