Yêu cầu nhập số có xét điều kiện: start phải lớn hơn 0, và end phải lớn hơn start, sai số nào bắt nhập lại số đó.
Khối lệnh sử dụng: while, if-else.
Chào các bạn! Hôm nay chúng ta sẽ cùng làm “thám tử số học” để tìm ra những số nguyên tố ẩn trong một khoảng số! 🕵️♂️
🎭 Hãy tưởng tượng:
- Bạn là một thám tử số học có nhiệm vụ tìm những “viên ngọc quý” (số nguyên tố) 💎
- Hoặc bạn là nhà khảo cổ đang tìm kho báu trong một khu vực nhất định 🗺️
- Hoặc đơn giản, bạn muốn tìm hiểu xem trong đoạn từ số A đến số B có những số nào “đặc biệt”! ✨
Nhiệm vụ hôm nay: Viết chương trình có thể:
- Nhập 2 số (start và end) với điều kiện hợp lệ
- Duyệt qua tất cả các số trong khoảng đó
- Kiểm tra từng số xem có phải số nguyên tố không
- In ra danh sách tất cả số nguyên tố tìm được!
📚 KIẾN THỨC CẦN NHỚ
🎯 Số nguyên tố là gì?
Số nguyên tố là số tự nhiên lớn hơn 1, chỉ có đúng 2 ước là 1 và chính nó.
Ví dụ dễ hiểu:
• Số 2: Chỉ chia hết cho 1 và 2 → Là số nguyên tố ✅
• Số 3: Chỉ chia hết cho 1 và 3 → Là số nguyên tố ✅
• Số 4: Chia hết cho 1, 2, 4 → KHÔNG phải số nguyên tố ❌
• Số 5: Chỉ chia hết cho 1 và 5 → Là số nguyên tố ✅

🔧 Công cụ chúng ta sẽ dùng:
- while: Để lặp qua các số trong khoảng
- if-else: Để kiểm tra điều kiện và số nguyên tố
- Validation: Kiểm tra input hợp lệ trước khi xử lý
💡 Thuật toán kiểm tra số nguyên tố:
// Ý tưởng đơn giản:
// Để kiểm tra số n có phải số nguyên tố:
// 1. Nếu n <= 1 → Không phải
// 2. Nếu n == 2 → Là số nguyên tố
// 3. Nếu n chẵn và > 2 → Không phải
// 4. Thử chia n cho các số lẻ từ 3 đến √n
// 5. Nếu chia hết cho số nào → Không phải
// 6. Nếu không chia hết cho số nào → Là số nguyên tố
🎯 PHÂN TÍCH ĐỀ BÀI
📋 Yêu cầu của đề:
- Nhập: 2 số nguyên start và end
- Điều kiện: start > 0 và end > start (nếu sai thì nhập lại)
- Xử lý: Dùng while lặp qua [start, end], if-else kiểm tra từng số
- Xuất: In ra các số nguyên tố tìm được
🗺️ Lược đồ giải quyết:
1. Nhập start (kiểm tra > 0, sai thì nhập lại)
2. Nhập end (kiểm tra > start, sai thì nhập lại)
3. Dùng while để i chạy từ start đến end
4. Với mỗi i, dùng if-else kiểm tra có phải số nguyên tố
5. Nếu là số nguyên tố thì in ra
6. Tăng i và lặp lại cho đến hết khoảng
🛠️ GIẢI THÍCH TỪNG BƯỚC
Bước 1: Nhập và kiểm tra start
int start;
do {
cout << "Nhập số bắt đầu (phải > 0): ";
cin >> start;
if (start <= 0) {
cout << "❌ Số phải lớn hơn 0! Vui lòng nhập lại." << endl;
}
} while (start <= 0);
Giải thích: Dùng vòng lặp do-while
để bắt buộc người dùng nhập số hợp lệ. Chỉ thoát khỏi vòng lặp khi start > 0
.
Nếu sử dụng while thì sao?
int start;
while (start <= 0) {
cout << "Nhập số bắt đầu (phải > 0): ";
cin >> start;
if (start <= 0) {
cout << "❌ Số phải lớn hơn 0! Vui lòng nhập lại." << endl;
}
} ;
Bước 2: Nhập và kiểm tra end
int end;
do {
cout << "Nhập số kết thúc (phải > " << start << "): ";
cin >> end;
if (end <= start) {
cout << "❌ Số kết thúc phải lớn hơn " << start << "! Vui lòng nhập lại." << endl;
}
} while (end <= start);
Giải thích: Tương tự, đảm bảo end > start
để có khoảng hợp lệ.
Nếu sử dụng while thì sao?
int end;
while (end <= start) {
cout << "Nhập số kết thúc (phải > " << start << "): ";
cin >> end;
if (end <= start) {
cout << "❌ Số kết thúc phải lớn hơn " << start << "! Vui lòng nhập lại." << endl;
}
};
Bước 3: Hàm kiểm tra số nguyên tố
bool laSoNguyenTo(int n) {
if (n <= 1) return false; // 0, 1 không phải số nguyên tố
if (n == 2) return true; // 2 là số nguyên tố duy nhất chẵn
if (n % 2 == 0) return false; // Các số chẵn khác không phải
// Kiểm tra các ước lẻ từ 3 đến √n
for (int i = 3; i * i <= n; i += 2) {
if (n % i == 0) return false;
}
return true;
}
Giải thích:
- Loại trừ nhanh các trường hợp đặc biệt
- Chỉ cần kiểm tra đến √n vì nếu n có ước > √n thì phải có ước tương ứng < √n
- Chỉ kiểm tra số lẻ để tăng hiệu suất
Sử dụng khối lẹnh WHILE và hàm sqrt() – căn bậc 2 trong C++ thì chúng ta cần include <cmath> nhé
#include <cmath> // Dùng để sử dụng các hàm toán học phổ biến trong C++
bool laSoNguyenTo(int n) {
if (n <= 1) return false; // 0, 1 không phải số nguyên tố
if (n == 2) return true; // 2 là số nguyên tố duy nhất chẵn
if (n % 2 == 0) return false; // Các số chẵn khác không phải
int i = 3; //Kiểm tra các ước từ 3
while (i <= sqrt(n)) {
if (n % i == 0) { //Nếu chia hết thì trả về False
return false;
}
i += 2;
/* - Chỉ kiểm tra các số lẻ
- Mỗi lần i sẽ tăng 2 đơn vị
- Thay thành ++ hoặc += 1 cũng được, nhưng tốn thời gian không tối ưu,
vì chúng ta chỉ cần kiểm tra số lẻ thôi
*/ } // Hàm While sẽ dừng khi i > sqrt(n)
return true; //Trả về kết quả kiểm tra số n là số nguyên tố.
}
Bước 4: Dùng while duyệt khoảng và kiểm tra
int current = start;
cout << "🔍 Các số nguyên tố trong khoảng [" << start << ", " << end << "]: ";
bool timThay = false;
while (current <= end) {
if (laSoNguyenTo(current)) {
cout << current << " ";
timThay = true;
}
current++;
}
if (!timThay) {
cout << "(Không có số nguyên tố nào)";
}
Giải thích:
- Dùng
while
như đề yêu cầu để lặp qua khoảng - Dùng
if-else
để kiểm tra và xử lý kết quả - Có cờ
timThay
để biết có số nguyên tố nào không
🎮 TEST CHƯƠNG TRÌNH
📝 Test case 1: Khoảng có nhiều số nguyên tố
Input: start = 10, end = 30
Expected Output: 11 13 17 19 23 29
📝 Test case 2: Khoảng không có số nguyên tố
Input: start = 24, end = 28
Expected Output: (Không có số nguyên tố nào)
📝 Test case 3: Khoảng nhỏ có số nguyên tố
Input: start = 2, end = 5
Expected Output: 2 3 5
📝 Test case 4: Validation input sai
Input: start = -5 (sai) → nhập lại: 1
Input: end = 0 (sai vì <= start) → nhập lại: 10
Expected Output: 2 3 5 7
🎯 BÀI TẬP THỰC HÀNH
🟢 Cấp độ dễ:
Bài 1: Version đơn giản hóa
/*
YÊU CẦU:
- Chỉ nhập start và end (không cần validation phức tạp)
- Chỉ cần kiểm tra input > 0 cơ bản
- In ra các số nguyên tố tìm được
- Sử dụng while và if-else như đề gốc
*/
Bài 2: Thêm đếm số lượng
/*
YÊU CẦU:
- Giống bài gốc nhưng thêm đếm số lượng số nguyên tố
- Hiển thị: "Tìm được X số nguyên tố"
- Thêm emoji và thông báo vui nhộn
*/
🟡 Cấp độ trung bình:
Bài 3: Thêm tính năng thống kê
/*
YÊU CẦU:
- Tính tỷ lệ số nguyên tố trong khoảng
- Tìm số nguyên tố lớn nhất và nhỏ nhất
- Hiển thị khoảng cách giữa các số nguyên tố liền kề
- Bảng thống kê đẹp mắt
*/
Bài 4: Menu lựa chọn
/*
YÊU CẦU:
- Menu: 1.Tìm trong khoảng 2.Kiểm tra 1 số 3.Top N số nguyên tố đầu tiên 4.Thoát
- Sử dụng switch-case cho menu
- Mỗi chức năng đều dùng while và if-else
- Loop menu cho đến khi chọn thoát
*/
🔴 Cấp độ khó:
Bài 5: Tối ưu thuật toán
/*
YÊU CẦU:
- Implement thuật toán Sieve of Eratosthenes
- So sánh hiệu suất với thuật toán cơ bản
- Đo thời gian thực thi
- Handle số rất lớn (đến 100,000)
- Hiển thị progress bar khi tính toán
*/
Bài 6: Phân tích chuyên sâu
/*
YÊU CẦU:
- Tìm cặp số nguyên tố sinh đôi (twin primes)
- Tìm dãy số nguyên tố liên tiếp dài nhất
- Phân tích phân bố số nguyên tố
- Vẽ biểu đồ ASCII distribution
- Export kết quả ra file text
*/
💡 MẸO VÀ THỦ THUẬT
🌟 Tối ưu thuật toán kiểm tra:
// Thay vì:
for (int i = 2; i < n; i++) {
if (n % i == 0) return false;
}
// Dùng:
for (int i = 2; i * i <= n; i++) { // Chỉ kiểm tra đến √n
if (n % i == 0) return false;
}
🎯 Validation input thông minh:
// Kết hợp kiểm tra nhiều điều kiện:
while (start <= 0 || start > 1000000) {
if (start <= 0)
cout << "Lỗi: Số phải > 0\n";
else
cout << "Lỗi: Số quá lớn (max: 1,000,000)\n";
cout << "Nhập lại: ";
cin >> start;
}
⚡ Hiển thị progress cho số lớn:
int current = start;
while (current <= end) {
if ((current - start) % 1000 == 0) {
cout << "Đã kiểm tra: " << (current - start) << "/" << (end - start + 1) << "\r";
cout.flush();
}
// ... kiểm tra số nguyên tố
current++;
}
🐛 TRÁNH CÁC LỖI THƯỜNG GẶP
❌ Lỗi 1: Quên xử lý số 2
// SAI: Bỏ qua số 2
if (n % 2 == 0) return false; // Sẽ loại bỏ luôn số 2!
// ĐÚNG: Xử lý riêng số 2
if (n == 2) return true; // 2 là số nguyên tố
if (n % 2 == 0) return false; // Các số chẵn khác
❌ Lỗi 2: Điều kiện while sai
// SAI: Có thể infinite loop
while (current < end) { // Thiếu dấu =
// ...
current++;
}
// ĐÚNG: Bao gồm cả end
while (current <= end) { // Có dấu = để bao gồm end
// ...
current++;
}
❌ Lỗi 3: Validation không đầy đủ
// SAI: Chỉ kiểm tra 1 điều kiện
if (start > 0) { /* OK */ }
// ĐÚNG: Kiểm tra đầy đủ
if (start > 0 && end > start && end <= MAX_VALUE) {
/* OK */}
📋 CHECKLIST HOÀN THÀNH
✅ Yêu cầu bắt buộc:
- Sử dụng while để lặp qua khoảng [start, end]
- Sử dụng if-else để kiểm tra số nguyên tố
- Validation: start > 0 và end > start
- Nhập lại nếu input sai
- In ra tất cả số nguyên tố tìm được
- Code chạy đúng với các test case
✅ Điểm cộng nếu có:
- Giao diện đẹp mắt với emoji và border
- Thống kê số lượng và tỷ lệ số nguyên tố
- Xử lý trường hợp không tìm thấy số nào
- Comments giải thích rõ ràng
- Tối ưu thuật toán kiểm tra số nguyên tố
- Error handling toàn diện
🎊 TỔNG KẾT
🏆 Bạn đã học được:
- ✨ Cách kết hợp while và if-else để giải bài toán thực tế
- 🎯 Validation input đầy đủ với các điều kiện phức tạp
- 🔢 Thuật toán kiểm tra số nguyên tố hiệu quả
- 💪 Kỹ năng debug và test chương trình với nhiều trường hợp
🌟 Tại sao bài này quan trọng:
- Tư duy thuật toán: Phân tích bài toán thành các bước nhỏ
- Kỹ năng validation: Đảm bảo chương trình robust
- Optimization: Tối ưu thuật toán để xử lý số lớn
- Real-world application: Áp dụng vào bài toán thực tế
🚀 Level up achieved:
Từ “người mới học vòng lặp” → “thám tử số học chuyên nghiệp” 🔍✨
💬 HỎI ĐÁP THÔNG MINH
❓ Câu hỏi thường gặp:
Q: Tại sao chỉ cần kiểm tra đến √n?
A: Vì nếu n có ước lớn hơn √n thì chắc chắn có ước tương ứng nhỏ hơn √n. Ví dụ: 15 = 3×5, khi kiểm tra đến √15 ≈ 3.87, ta đã tìm thấy ước 3.
Q: Tại sao dùng while thay vì for?
A: Đề bài yêu cầu dùng while. Trong thực tế, for có thể ngắn gọn hơn nhưng while linh hoạt hơn cho các điều kiện phức tạp.
Q: Số 1 có phải số nguyên tố không?
A: Không! Theo định nghĩa, số nguyên tố phải có đúng 2 ước. Số 1 chỉ có 1 ước là chính nó.
Q: Làm sao xử lý số rất lớn?
A: Dùng thuật toán Sieve of Eratosthenes hoặc Miller-Rabin cho số cực lớn. Với bài này, thuật toán cơ bản đã đủ cho số nhỏ hơn 100,000.
🆘 Cần trợ giúp?
- 💻 Test online: onlinegdb.com
- 🔢 Kiểm tra kết quả: Dùng máy tính hoặc search “prime numbers in range”
- 📚 Học thêm: Tìm hiểu về sàng Eratosthenes
🌟 CODE HOÀN CHỈNH
Đây là bài giải mẫu. Chúng ta nên tự giải bài tập dựa theo hướng dẫn của Admin trước hãy xem bài giải nhé. (Vui lòng đăng nhập để xem).
🎉 LỜI KHÍCH LỆ CUỐI BÀI
Xuất sắc! Bạn vừa hoàn thành một bài toán khá phức tạp với sự kết hợp thông minh của nhiều kỹ thuật! 🚀
💪 Việc tìm số nguyên tố không chỉ là bài tập – đây là nền tảng cho cryptography (mã hóa), cybersecurity và nhiều ứng dụng quan trọng trong công nghệ hiện đại!
🌟 Điều đặc biệt: Bạn đã học cách validation input chuyên nghiệp, tối ưu thuật toán và handle edge cases – đây chính là những kỹ năng của một lập trình viên thực thụ!
🎯 Keep exploring! Số học và thuật toán còn vô vàn điều thú vị đang chờ bạn khám phá!
Tiếp tục hành trình chinh phục toán học với C++! 🔍💎
🏷️ Tags:
#C++
#số-nguyên-tố
#while-loop
#if-else
#validation
#thuật-toán
#bài-tập-thực-hành
#prime-numbers
#input-validation
#dễ-hiểu
#Việt-Nam
#programming-tutorial