Editorial for C++ Bài 3.B5: Số nguyên tố
Submitting an official solution before solving the problem yourself is a bannable offence.
Lời giải chi tiết:
Đầu tiên, các bạn cần khai báo kiểu dữ liệu của số nguyên N dựa vào khoảng giá trị đề bài đưa N (\(N<=10^{9}\)).
Bước 2, các bạn dùng lệnh cin
để nhập số vừa khai báo ở trên.
Bước 3, sử dụng câu lệnh if, else if, else
để kiểm tra các trường hợp:
Nếu số vừa nhập nhỏ hơn 2 thì in ra
No
luôn.Ngược lại, nếu số đó lớn hơn hoặc bằng 2, sử dụng một vòng lặp for bắt đầu từ \(i = 2\) và chạy cho đến khi \(i × i\) lớn hơn \(n\). Vòng lặp này dùng để kiểm tra xem \(n\) có chia hết cho bất kỳ số nào trong đoạn từ 2 đến \(\sqrt{n}\) không (vì nếu \(n\) có một ước số là \(a\) thì nó cũng sẽ có ước số là \(n / a\)). Trong vòng lặp, nếu \(n\) chia hết cho \(i\) (nghĩa là \(n\) có ước số khác 1 và \(n\)), thì sẽ in ra
No
luôn và dừng vòng lặp, tức là \(n\) không phải là số nguyên tố.
Giải thích cụ thể: Duyệt chỉ đến căn bậc 2 của \(n\) trong kiểm tra số nguyên tố là một cách hiệu quả để giảm độ phức tạp thời gian của thuật toán. Giả sử \(n\) không phải là số nguyên tố và có một ước số \(a\) nằm trong khoảng từ 2 đến \(\sqrt{n}\). Nếu \(a\) lớn hơn \(\sqrt{n}\), thì \(n / a\) sẽ nằm trong khoảng từ \(\sqrt{n}\) đến \(\sqrt{n}\) x \(\sqrt{n}\) = \(n\). Điều này có nghĩa là nếu có một ước số \(a\) lớn hơn \(\sqrt{n}\), thì có một ước số \(n/a\) tương ứng nhỏ hơn \(\sqrt{n}\). Do đó, nếu ta đã kiểm tra qua tất cả các ước số từ 2 đến \(\sqrt{n}\) mà không tìm thấy ước số nào, thì ta không cần kiểm tra các ước số lớn hơn \(\sqrt{n}\) vì ta đã xác định được \(n\) là số nguyên tố. Điều này đặc biệt quan trọng khi \(n\) là một số lớn, giúp giảm độ phức tạp thời gian của thuật toán từ \(O(n)\) xuống còn \(O(\sqrt{n})\).Nếu chạy hết vòng lặp mà không có số nào mà \(n\) chia hết, in ra
Yes
, đây là số nguyên tố.
Comments