- Siêu lớp và danh mục iOS/Objective-C
- object-c - -1001 lỗi khi NSURLSession vượt qua httpproxy và /etc/hosts
- java - Nhận địa chỉ url bằng lớp mạng
- ios - Âm thanh không phát trong thông báo đẩy
Đây là mã của tôi để tìm số nguyên tố bằng cách sử dụng Sàng Eratosthenes.
list = [i cho i in range(2, int(raw_input("Tính các số nguyên tố lên tới số nào?"))+1)]
cho tôi trong danh sách:
cho một trong danh sách:
nếu a!=i và a%i == 0:
list.remove(a)
Cố gắng tìm cách cô đọng các vòng lặp for lồng nhau thành một loại trình tạo hoặc khả năng hiểu nào đó, nhưng có vẻ như bạn không thể sử dụng khả năng hiểu để áp dụng các hàm cho danh sách. Tôi đã thử sử dụng bản đồ và bộ lọc nhưng dường như tôi không thể làm đúng.
Hãy suy nghĩ về những điều như thế này:
print map(list.remove(a), filter(lambda a, i: (a%i ==0 and a!=i), [(a, i) for i in list for a in list])
Rõ ràng có nhiều lý do khiến việc này không hiệu quả. Nếu tôi chỉ sử dụng phần bộ lọc của mã này:
filter(lambda a, i: (a%i ==0 and a!=i), **[(a, i) for i in list for a in list]**
Cách chính xác để đặt hai biến vào lambda là gì? (a,i) biến nó thành một bộ, nhưng tôi muốn gửi "a" và "i" dưới dạng các biến độc lập vào lambda.
Cuối cùng tôi đã giải quyết được vấn đề với lớp lót này:
print đã sắp xếp(set([i for i in range(2, int(raw_input("Tính các số nguyên tố lên tới số nào?"))+1)]).difference(a for i in l for a in l if a!= tôi và a%i == 0))
câu trả lời hay nhất
Điều đầu tiên cần lưu ý là bạn không viết về Sàng Eratosthenes. Hãy xem Sàng Eratosthenes hoàn toàn ngây thơ đã thực hiện bao nhiêu chu kỳ:
def sàng1(n):
vòng lặp = 0
số = set(range(2, n))
cho i trong phạm vi (2, int (n ** 0,5) + 1):
cho j trong phạm vi (i * 2, n, i):
số.discard(j)
vòng lặp += 1
trả về đã sắp xếp (số), vòng lặp
Bài kiểm tra:
>>>sàng1(100)
([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97],
178)
178 lần lặp của 100 số (không bao gồm sắp xếp). Điều này có thể được cải thiện bằng một số thay đổi nhỏ:
def sàng2(n):
vòng lặp = 0
số = phạm vi (0, n)
cho số nguyên tố:
nếu số nguyên tố < 2:
Tiếp tục
số nguyên tố Elif > n ** 0,5:
break
cho i trong phạm vi (nguyên tố ** 2, n, nguyên tố):
số[i] = 0
vòng lặp += 1
trả về [x cho x theo số nếu x > 1], vòng lặp
Bài kiểm tra:
>>>sàng2(100)
([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97],
102)
102 vòng cho 100 số (không bao gồm bộ lọc ở cuối). Bây giờ hãy nhìn vào của bạn:
def sàng3 (n):
vòng lặp = 0
số = phạm vi (2, n)
cho tôi bằng số:
cho j bằng số:
nếu j != i và j % i == 0:
số.remove(j)
vòng lặp += 1
trả về số, vòng lặp
Bài kiểm tra:
>>>sàng3(100)
([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41,
43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89, 97],
663)
Mọi chuyện trở nên tồi tệ hơn:
>>> [sàng1(x)[1] cho x trong [100, 1000, 10000]]
[178, 2978, 41723]
>>> [sàng2(x)[1] cho x trong [100, 1000, 10000]]
[102, 1409, 16979]
>>> [sàng3(x)[1] cho x trong [100, 1000, 10000]]
[663, 28986, 1523699]
hiện hữu n=10000
, việc triển khai của bạn thực hiện công việc gần như gấp 100 lần!
Lời khuyên của tôi là trước tiên hãy tạo một triển khai hợp lý và sau đó làm cho nó "nhỏ gọn". Viết code có thể thú vị nhưng không thể nào hay bằng viết láchCó hiệu quảĐoạn mã này càng mang tính thách thức hoặc càng truyền cảm hứng, bất kể độ dài.
Điều đó nói rằng, hãy xem xét dòng mã này (nếu bạn không tính số lần nhập, bạn có thể thực hiện bằng cách sử dụng lambda x, y: x - y
thay thế để loại bỏ nó operator.sub
). Điều này thực hiện thuật toán đầu tiên, với những cải tiến nhỏ:
>>> từ toán tử nhập phụ
>>> less(sub, (set(range(x ** 2, 100, x)) cho x trong range(2, int(100 ** 0.5) + 1)), set(range(2, 100)) )
set([2, 3, 5, 7, 11, 13, 17, 19, 23, 29, 31, 37, 41, 43, 47, 53, 59, 61, 67, 71, 73, 79, 83, 89 , 97])
Về Python - Sieve of Eratosthenes - Compact Python, chúng tôi tìm thấy một câu hỏi tương tự trên Stack Overflow: https://stackoverflow.com/questions/6687296/
Tôi đang cố gắng viết một hàm đếm tất cả các số nguyên tố lẻ từ 1..n bằng thuật toán "Sieve of Sundaram" Đây là nỗ lực của tôi: sSund::Integer -> [Integer]
Tôi mới làm quen với Haskell và đối với thứ tôi đang triển khai, tôi cần một danh sách các số nguyên tố. Tôi đã thử viết một cái nhưng nó quá chậm. Đây là những gì tôi đã thử. primeList = số nguyên tố 1000 số nguyên tố :: Int ->
Tôi là một lập trình viên xuất sắc, rất giỏi!