Hỏi đáp
Chia sẻ kiến thức, cùng nhau phát triển
Mình có ý tưởng này :
Nhập x.
Nếu x chia hết cho 2,3,5,7 thì KHÔNG phải là số nguyên tố
đương nhiên phải kiểm tra xem x có bằng 2,3,5,7 ko đã
Đây là một ý tưởng vu vơ :)) sau khi xem code sàng eratosthenes vì là ý tưởng vu vơ chưa được thử nghiệm nhiều nên là sai cho mình xin lỗi, cái này chắc sẽ phù hợp với những số cực lớn ví dụ như tỷ tỷ còn mấy thuật toán kia vẫn tốt chán :)))
CODE MẪU:
if ((x == 7) || (x == 5) || (x == 3) || (x == 2)) { cout << 1; }
if ((x % 2 == 0) || (x % 3 == 0) || (x % 5 == 0) || (x % 7 == 0)) { cout << 0; } else { cout << 1; }
Thế code bạn phải ktra thêm các TH còn lại nữa đấy, nhưng mà bạn nghĩ đc vậy cũng tốt, theo mình ước tính thì sau khi check 2,3,5,7 thì loại đc tầm 90% hợp số ra rồi (thực tế thì nó cũng cỡ cỡ vậy 87% gì đấy nhưng mà chắc sẽ có chênh lệch)
Code bạn sẽ giúp tối ưu việc kiểm tra từng số nguyên tố lớn (tuy nhiên phải lấy chất lượng bù cho số lượng do việc làm này sẽ không giúp bạn kiểm tra nhanh một lần nhiều số nhưng nếu từng số thì sẽ rất nhanh), chẳng hạn giới hạn của số nguyên tố cần kiểm tra là 10^16 đi thì bạn ko xài eratosthenes đc nhưng mà nếu ktra 1 số duy nhất hoặc 10 số thì bạn xài kiểm tra tới căn sẽ nhanh hơn, ngoài ra tối ưu việc kiểm tra tới căn một lần nữa thì sẽ đc độ phức tạp cỡ O(sqrt(n)/6)
Đây bạn nhé
Btw: thực ra check 5 và 7 trước cũng đc nhưng mà ngồi if n % 5 == 0, n % 7 == 0, n == 5, n == 7 dài vãi ra nên mình nhét luôn vô cái hàm for, còn công thức thì dựa trên một định lý toán học đã đc chứng minh về số nguyên tố lớn hơn hoặc bằng 5, bạn cố tìm nếu muốn biết thêm nhé, mình quên từ đời nào rồi, lười google quá.