Chào các bạn! Hôm nay chúng ta sẽ trở thành “thám tử số học” để phá án bí ẩn: một con số là chẵn hay lẻ? 🕵️♂️🔍
🎭 Hãy tưởng tượng:
- Bạn làthám tử Conancủa thế giới số học! 🧠
- Hoặc bạn làmáy phân loại thông minhtự động xếp số vào 2 nhóm! ⚙️
- Hoặc đơn giản, bạn muốnkhông bao giờ nhầm lẫnchẵn lẻ nữa! ✨
Hôm nay bạn sẽ:
- Ôn lại kiến thứcsố chẵn và số lẻ từ môn Toán
- Khám phá bí mậttoán tử % (chia lấy dư) siêu mạnh
- Viết chương trìnhkiểm tra chẵn lẻ hoàn chỉnh với if-else
- Thực hànhvới 20+ bài tập từ dễ đến siêu khó!
// Bí mật của thám tử:
int so = 17;
if (so % 2 == 0) {
cout << so << " là số chẵn!";
} else {
cout << so << " là số lẻ!"; // Kết quả: 17 là số lẻ!
}
Từ bây giờ, bạn sẽ trở thành “master chẵn lẻ” giải quyết mọi bài toán phân loại! 🚀
📚 KIẾN THỨC CƠ BẢN VỀ SỐ CHẴN VÀ SỐ LẺ
🎯 Định nghĩa cơ bản:
Loại số | Định nghĩa | Ví dụ | Tính chất |
---|---|---|---|
Số chẵn | Chia hết cho 2 | 0, 2, 4, 6, 8, 10… | Kết thúc bằng 0, 2, 4, 6, 8 |
Số lẻ | Không chia hết cho 2 | 1, 3, 5, 7, 9, 11… | Kết thúc bằng 1, 3, 5, 7, 9 |
🔍 Bí mật toán tử % (chia lấy dư):
Nguyên lý hoạt động:
số % 2
cho taphần dưkhi chia số đó cho 2- Nếudư = 0→ số chẵn (chia hết)
- Nếudư = 1→ số lẻ (không chia hết)
Ví dụ minh họa:
8 % 2 = 0 // 8 chia 2 được 4, dư 0 → CHẴN
9 % 2 = 1 // 9 chia 2 được 4, dư 1 → LẺ
🧮 THUẬT TOÁN KIỂM TRA CHẴN LẺ
🎪 Sơ đồ khối đơn giản:
BƯỚC 1: Nhập số cần kiểm tra
↓
BƯỚC 2: Tính phần dư: so % 2
↓
BƯỚC 3: Kiểm tra dư
↓
dư = 0? ────YES──→ In "Số chẵn"
↓
NO
↓
In "Số lẻ"
💡 Code thuật toán cơ bản:
#include <iostream>
using namespace std;
int main() {
int so;
cout << "KIỂM TRA SỐ CHẴN LẺ" << endl;
cout << "Nhập một số nguyên: ";
cin >> so;
if (so % 2 == 0) {
cout << so << " là số chẵn!" << endl;
} else {
cout << so << " là số lẻ!" << endl;
}
return 0;
}
🎪 CHƯƠNG TRÌNH HOÀN CHỈNH VÀ CHUYÊN NGHIỆP
/*
════════════════════════════════════════════════════════════
BÀI TẬP 21: KIỂM TRA SỐ CHẴN LẺ - THÁM TỬ SỐ HỌC
Tác giả: [Tên bạn]
Mục đích: Phân loại số nguyên thành chẵn hoặc lẻ
════════════════════════════════════════════════════════════
*/
#include <iostream>
#include <iomanip>
#include <cmath>
using namespace std;
int main() {
// ═══════════════════════════════════════════════════════
// PHẦN GIỚI THIỆU
// ═══════════════════════════════════════════════════════
cout << "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟\n";
cout << "🎲 KIỂM TRA SỐ CHẴN LẺ - THÁM TỬ SỐ HỌC 🎲\n";
cout << "🌟 Phá án bí ẩn: Chẵn hay Lẻ? 🌟\n";
cout << "🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟🌟\n\n";
// ═══════════════════════════════════════════════════════
// KIẾN THỨC CƠ BẢN
// ═══════════════════════════════════════════════════════
cout << "📚 KIẾN THỨC CƠ BẢN:\n";
cout << "════════════════════════════════════════════════\n";
cout << "🔢 Số chẵn: Chia hết cho 2 (dư 0)\n";
cout << " Ví dụ: 0, 2, 4, 6, 8, 10, 12...\n\n";
cout << "🎯 Số lẻ: Không chia hết cho 2 (dư 1)\n";
cout << " Ví dụ: 1, 3, 5, 7, 9, 11, 13...\n\n";
cout << "🔑 Bí mật: Dùng toán tử % (chia lấy dư)\n";
cout << " • số % 2 = 0 → CHẴN\n";
cout << " • số % 2 = 1 → LẺ\n\n";
// ═══════════════════════════════════════════════════════
// DEMO NHANH
// ═══════════════════════════════════════════════════════
cout << "🎮 DEMO NHANH - MỘT SỐ VÍ DỤ:\n";
cout << "════════════════════════════════════════════════\n";
int demoCases[] = {8, 9, 15, 20, 0, -3, -8};
int numDemos = sizeof(demoCases) / sizeof(demoCases[0]);
for (int i = 0; i < numDemos; i++) {
int so = demoCases[i];
int du = so % 2;
cout << "• " << setw(3) << so << " % 2 = " << du;
cout << " → " << so << " là số ";
if (du == 0) {
cout << "CHẴN ✅" << endl;
} else {
cout << "LẺ 🎯" << endl;
}
}
cout << "\n";
// ═══════════════════════════════════════════════════════
// NHẬP DỮ LIỆU
// ═══════════════════════════════════════════════════════
int so;
cout << "📝 BÂY GIỜ ĐẾN LƯỢT BẠN:\n";
cout << "════════════════════════════════════════════════\n";
// Input validation với while loop
while (true) {
cout << "🔢 Nhập một số nguyên để kiểm tra: ";
if (cin >> so) {
break; // Input hợp lệ
} else {
cout << "❌ Vui lòng nhập một số nguyên hợp lệ!\n" << endl;
cin.clear(); // Xóa flag lỗi
cin.ignore(1000, '\n'); // Bỏ qua input sai
}
}
// ═══════════════════════════════════════════════════════
// PHÂN TÍCH CHI TIẾT
// ═══════════════════════════════════════════════════════
cout << "\n🔍 PHÂN TÍCH CHI TIẾT:\n";
cout << "════════════════════════════════════════════════\n";
cout << "📊 Số bạn nhập: " << so << endl;
// Xử lý số âm (lấy giá trị tuyệt đối cho việc phân tích)
int soTuyetDoi = abs(so);
cout << "🔢 Giá trị tuyệt đối: " << soTuyetDoi << endl;
// Tính toán chi tiết
int thuong = so / 2;
int du = so % 2;
cout << "➗ Phép chia: " << so << " ÷ 2 = " << thuong;
if (du != 0) {
cout << " dư " << du;
}
cout << endl;
cout << "🎯 Phần dư: " << so << " % 2 = " << du << endl;
// ═══════════════════════════════════════════════════════
// KẾT QUẢ CUỐI CÙNG
// ═══════════════════════════════════════════════════════
cout << "\n🏆 KẾT QUẢ:\n";
cout << "════════════════════════════════════════════════\n";
if (so % 2 == 0) {
cout << "✅ " << so << " là số CHẴN!" << endl;
cout << "💡 Lý do: " << so << " chia hết cho 2 (dư 0)" << endl;
// Thông tin bổ sung cho số chẵn
cout << "📈 Đặc điểm số chẵn:" << endl;
cout << " • Có thể chia đôi đều" << endl;
cout << " • Kết thúc bằng chữ số: 0, 2, 4, 6, 8" << endl;
} else {
cout << "🎯 " << so << " là số LẺ!" << endl;
cout << "💡 Lý do: " << so << " không chia hết cho 2 (dư 1)" << endl;
// Thông tin bổ sung cho số lẻ
cout << "📈 Đặc điểm số lẻ:" << endl;
cout << " • Không thể chia đôi đều" << endl;
cout << " • Kết thúc bằng chữ số: 1, 3, 5, 7, 9" << endl;
}
// ═══════════════════════════════════════════════════════
// THÔNG TIN THÊM
// ═══════════════════════════════════════════════════════
cout << "\n🎨 THÔNG TIN THÊM VỀ " << so << ":\n";
cout << "════════════════════════════════════════════════\n";
// Phân tích chữ số cuối
int chuSoCuoi = abs(so) % 10;
cout << "🔤 Chữ số cuối: " << chuSoCuoi << endl;
if (chuSoCuoi == 0 || chuSoCuoi == 2 || chuSoCuoi == 4 ||
chuSoCuoi == 6 || chuSoCuoi == 8) {
cout << " → Chữ số cuối chẵn → Số chẵn!" << endl;
} else {
cout << " → Chữ số cuối lẻ → Số lẻ!" << endl;
}
// Tính các số liên quan
cout << "🔢 Các số liên quan:" << endl;
cout << " • Số trước: " << (so - 1) << " là " << ((so - 1) % 2 == 0 ? "CHẴN" : "LẺ") << endl;
cout << " • Số sau: " << (so + 1) << " là " << ((so + 1) % 2 == 0 ? "CHẴN" : "LẺ") << endl;
cout << " • Gấp đôi: " << (so * 2) << " là " << ((so * 2) % 2 == 0 ? "CHẴN" : "LẺ") << " (luôn chẵn!)" << endl;
// ═══════════════════════════════════════════════════════
// THÁCH THỨC BONUS
// ═══════════════════════════════════════════════════════
cout << "\n🎮 THÁCH THỨC BONUS:\n";
cout << "════════════════════════════════════════════════\n";
int count = 0;
cout << "🏃♂️ Kiểm tra 10 số liên tiếp từ " << so << ":" << endl;
for (int i = so; i < so + 10; i++) {
cout << i << " ";
if (i % 2 == 0) {
cout << "(chẵn) ";
count++;
} else {
cout << "(lẻ) ";
}
if ((i - so + 1) % 5 == 0) cout << endl; // Xuống dòng mỗi 5 số
}
cout << "\n📊 Thống kê: " << count << " số chẵn, " << (10 - count) << " số lẻ" << endl;
// ═══════════════════════════════════════════════════════
// KẾT THÚC VUI VẺ
// ═══════════════════════════════════════════════════════
cout << "\n🎉 HOÀN THÀNH KIỂM TRA!\n";
cout << "════════════════════════════════════════════════\n";
cout << "✅ Đã sử dụng toán tử % (chia lấy dư)\n";
cout << "✅ Đã áp dụng if-else để phân loại\n";
cout << "✅ Đã xử lý input validation\n";
cout << "✅ Đã phân tích chi tiết kết quả\n\n";
cout << "🌟 BẠN ĐÃ LÀ THÁM TỬ SỐ HỌC CHUYÊN NGHIỆP! 🌟\n";
// ═══════════════════════════════════════════════════════
// CHẠY LẠI CHƯƠNG TRÌNH
// ═══════════════════════════════════════════════════════
char tiepTuc;
cout << "\nBạn có muốn kiểm tra số khác không? (y/n): ";
cin >> tiepTuc;
if (tiepTuc == 'y' || tiepTuc == 'Y') {
cout << "\n" << string(60, '=') << "\n\n";
main(); // Gọi lại hàm main (recursive)
}
return 0;
}
🎯 BÀI TẬP THỰC HÀNH – 3 CẤP ĐỘ
🟢 CẤP ĐỘ DỄ: Làm quen với chẵn lẻ
Bài 1: Kiểm tra chẵn lẻ đơn giản
/*
YÊU CẦU:
- Viết chương trình nhập 1 số và kiểm tra chẵn/lẻ
- Sử dụng toán tử % và if-else
- In kết quả rõ ràng: "X là số chẵn" hoặc "X là số lẻ"
- Test với các số: 4, 7, 0, -3, -8
*/
// Gợi ý bắt đầu:
int so;
cout << "Nhập số: ";
cin >> so;
if (so % 2 == 0) {
cout << so << " là số chẵn!" << endl;
} else {
cout << so << " là số lẻ!" << endl;
}
Bài 2: Kiểm tra nhiều số liên tiếp
/*
YÊU CẦU:
- Nhập số đầu và số cuối của khoảng
- Kiểm tra và in tất cả số chẵn trong khoảng đó
- Đếm có bao nhiêu số chẵn, bao nhiêu số lẻ
- Ví dụ: từ 5 đến 12 → chẵn: 6,8,10,12 (4 số)
*/
Bài 3: Phân loại với emoji
/*
YÊU CẦU:
- Kiểm tra số chẵn/lẻ và hiển thị với emoji
- Số chẵn: 😊 (vui vẻ)
- Số lẻ: 😎 (ngầu)
- Thêm màu sắc nếu terminal hỗ trợ
- Làm cho giao diện thật đẹp và vui nhộn
*/
🟡 CẤP ĐỘ TRUNG BÌNH: Ứng dụng thực tế
Bài 4: Game đoán chẵn lẻ
/*
YÊU CẦU:
- Máy random 1 số từ 1-100
- Người chơi đoán chẵn hay lẻ
- Kiểm tra kết quả và thông báo thắng/thua
- Đếm điểm: thắng +1, thua -1
- Chơi 10 lượt và thông báo kết quả cuối
*/
Bài 5: Phân tích dãy số
/*
YÊU CẦU:
- Nhập n số nguyên vào mảng
- Tách thành 2 dãy: chẵn và lẻ
- Hiển thị 2 dãy đã tách
- Tính tổng, trung bình của mỗi dãy
- Tìm số lớn nhất trong mỗi dãy
*/
Bài 6: Tạo pattern số chẵn lẻ
/*
YÊU CẦU:
- Tạo pattern hình tam giác bằng số chẵn/lẻ
- Ví dụ với n=5:
2
2 4
2 4 6
2 4 6 8
2 4 6 8 10
- Làm tương tự với số lẻ
- Bonus: pattern hình kim cương
*/
🔴 CẤP ĐỘ KHÓ: Thử thách toán học
Bài 7: Thuật toán sàng số chẵn/lẻ
/*
YÊU CẦU:
- Input: mảng n số nguyên bất kỳ
- Sắp xếp sao cho: số chẵn trước, số lẻ sau
- Giữ nguyên thứ tự tương đối trong mỗi nhóm
- Ví dụ: [1,4,3,8,5,2] → [4,8,2,1,3,5]
- Độ phức tạp: O(n), không dùng mảng phụ
*/
Bài 8: Phân tích tính chẵn lẻ của biểu thức
/*
YÊU CẦU:
- Nhập biểu thức dạng: a*x + b
- Với x là số nguyên bất kỳ
- Phân tích khi nào biểu thức cho kết quả chẵn/lẻ
- Quy luật:
+ a chẵn, b chẵn: luôn chẵn
+ a chẵn, b lẻ: luôn lẻ
+ a lẻ, b chẵn: theo x
+ a lẻ, b lẻ: ngược với x
- Test với nhiều bộ (a,b,x)
*/
🏆 THỬ THÁCH BONUS – DÀNH CHO SIÊU SAO
Challenge 1: “Parity Bit Calculator”
/*
NHIỆM VỤ:
- Input: số nguyên dương
- Chuyển sang nhị phân
- Đếm số bit 1 trong biểu diễn nhị phân
- Tính parity bit (chẵn/lẻ của số bit 1)
- Ví dụ: 13 → 1101 → 3 bit 1 → lẻ
- Ứng dụng: mã hóa, sửa lỗi dữ liệu
*/
Challenge 2: “Even-Odd Magic Square”
/*
NHIỆM VỤ:
- Tạo ma phương (magic square) 4×4
- Sắp xếp sao cho: số chẵn ở góc, số lẻ ở giữa
- Tổng mỗi hàng/cột/đường chéo đều bằng nhau
- Kiểm tra tính đúng đắn của ma phương
- Hiển thị ma phương đẹp mắt với màu sắc
*/
🎮 CÁC VÍ DỤ MINH HỌA CHI TIẾT
🌟 Ví dụ 1: Số dương chẵn
Input: 24
Phân tích: 24 ÷ 2 = 12 dư 0
Kết quả: 24 là số chẵn!
🌟 Ví dụ 2: Số dương lẻ
Input: 37
Phân tích: 37 ÷ 2 = 18 dư 1
Kết quả: 37 là số lẻ!
🌟 Ví dụ 3: Số âm chẵn
Input: -16
Phân tích: -16 ÷ 2 = -8 dư 0
Kết quả: -16 là số chẵn!
🌟 Ví dụ 4: Số âm lẻ
Input: -25
Phân tích: -25 ÷ 2 = -12 dư -1 (nhưng -25 % 2 = -1)
Kết quả: -25 là số lẻ!
🌟 Ví dụ 5: Số 0
Input: 0
Phân tích: 0 ÷ 2 = 0 dư 0
Kết quả: 0 là số chẵn! (theo quy ước toán học)
💡 MẸO VÀ THỦ THUẬT CHUYÊN NGHIỆP
🌟 1. Xử lý số âm chính xác:
// Cách 1: Kiểm tra trực tiếp (khuyến nghị)
if (so % 2 == 0) {
cout << "Chẵn";
} else {
cout << "Lẻ";
}
// Cách 2: Dùng abs() nếu cần
int du = abs(so) % 2;
if (du == 0) {
cout << "Chẵn";
}
🎯 2. Kiểm tra chẵn lẻ nhanh hơn (bitwise):
// Cách thông thường
if (so % 2 == 0) { /* chẵn */ }
// Cách bitwise (nâng cao)
if ((so & 1) == 0) { /* chẵn */ }
// Giải thích: bit cuối = 0 → chẵn, bit cuối = 1 → lẻ
⚡ 3. Hàm tiện ích:
bool laSoChan(int so) {
return so % 2 == 0;
}
bool laSoLe(int so) {
return so % 2 != 0;
}
string phanLoai(int so) {
return (so % 2 == 0) ? "chẵn" : "lẻ";
}
🎨 4. Hiển thị đẹp mắt:
void hienThiKetQua(int so) {
cout << "┌────────────────────────┐" << endl;
cout << "│ Số: " << setw(10) << so << " │" << endl;
cout << "│ Loại: " << setw(8) << (so % 2 == 0 ? "CHẴN" : "LẺ") << " │" << endl;
cout << "└────────────────────────┘" << endl;
}
🐛 TRÁNH CÁC LỖI THƯỜNG GẶP
❌ Lỗi 1: Quên xử lý số âm
// SAI: Có thể nhầm lẫn với số âm
int so = -5;
if (so % 2 == 1) { // Sai! -5 % 2 = -1, không phải 1
cout << "Lẻ";
}
// ĐÚNG: So sánh với 0
if (so % 2 == 0) {
cout << "Chẵn";
} else {
cout << "Lẻ"; // Bao gồm cả trường hợp âm
}
❌ Lỗi 2: Nhầm điều kiện
// SAI: Logic ngược
if (so % 2 == 1) {
cout << "Chẵn"; // Sai!
}
// ĐÚNG: Logic đúng
if (so % 2 == 0) {
cout << "Chẵn"; // Đúng!
}
❌ Lỗi 3: Không validate input
// SAI: Không kiểm tra input
int so;
cin >> so; // Nếu nhập chữ sẽ bị lỗi
// ĐÚNG: Validate input
int so;
while (!(cin >> so)) {
cout << "Vui lòng nhập số nguyên!" << endl;
cin.clear();
cin.ignore(1000, '\n');
}
📋 CHECKLIST HOÀN THÀNH
✅ Kiến thức cơ bản:
- Hiểu định nghĩa số chẵn (chia hết cho 2)
- Hiểu định nghĩa số lẻ (không chia hết cho 2)
- Biết cách sử dụng toán tử % (chia lấy dư)
- Áp dụng if-else để phân loại
- Xử lý đúng cả số âm và số 0
✅ Kỹ năng lập trình:
- Validate input để tránh lỗi
- Format output đẹp mắt và rõ ràng
- Viết hàm kiểm tra chẵn lẻ tái sử dụng
- Xử lý edge cases (số âm, số 0)
- Comment code rõ ràng
✅ Ứng dụng nâng cao:
- Tạo game đoán chẵn lẻ
- Phân tích dãy số thành 2 nhóm chẵn/lẻ
- Tạo pattern hình học với số chẵn/lẻ
- Sắp xếp mảng theo tính chẵn lẻ
- Ứng dụng vào bài toán thực tế
🎊 TỔNG KẾT BÀI HỌC
🏆 Chúc mừng! Bạn đã trở thành “MASTER CHẴN LẺ”!
📚 Những gì bạn đã học:
- ✨Kiến thức toán:Số chẵn, số lẻ và tính chất đặc trưng
- 🎯Toán tử %:Chia lấy dư – công cụ mạnh mẽ trong lập trình
- 🔗If-else:Áp dụng điều kiện để phân loại
- ⚡Input validation:Xử lý input an toàn và chuyên nghiệp
- 🧠Problem solving:Phân tích bài toán và tư duy thuật toán
🌟 Tại sao bài này quan trọng:
- Foundation:Nền tảng cho nhiều thuật toán phân loại
- Modular arithmetic:Cơ sở cho mật mã học, hash function
- Pattern recognition:Nhận dạng quy luật trong dãy số
- Real applications:Xử lý dữ liệu, game development, AI
🚀 Bước tiếp theo:
Bài 22: “[DỰ ÁN MINI] Máy tính khoa học mini”– Tổng hợp tất cả kiến thức!
🎮 MINI GAME: “EVEN-ODD SPEED CHALLENGE”
🎯 Thử thách 120 giây:
Xác định nhanh các số sau là chẵn hay lẻ:
47
→ ?-18
→ ?0
→ ?235
→ ?-67
→ ?1024
→ ?999
→ ?-2
→ ?
⏰ Sẵn sàng? Bắt đầu!
💬 HỎI ĐÁP THÔNG MINH
❓ Câu hỏi thường gặp:
Q: Số 0 là chẵn hay lẻ?
A: Số 0 là số chẵn! Vì 0 chia hết cho 2 (0 ÷ 2 = 0 dư 0). Theo định nghĩa toán học, 0 thuộc tập số chẵn.
Q: Làm sao xử lý số âm đúng cách?
A: Dùng điều kiện số % 2 == 0
cho chẵn, số % 2 != 0
cho lẻ. Điều này hoạt động đúng với cả số âm.
Q: Tại sao dùng % thay vì chia thông thường?
A: Vì ta chỉ quan tâm phần dư, không quan tâm thương. Toán tử % cho ta phần dư trực tiếp, tiện lợi hơn.
Q: Có cách nào kiểm tra chẵn lẻ nhanh hơn không?
A: Có! Dùng bitwise AND: (số & 1) == 0
cho chẵn. Nhưng với người mới học, dùng % dễ hiểu hơn.
🆘 Cần trợ giúp?
- 💻Testvới các số đặc biệt: 0, -1, số rất lớn
- 🔍Debugbằng cách in ra giá trị
số % 2
- 📚Thực hànhvới nhiều ví dụ khác nhau
🎉 LỜI KHÍCH LỆ CUỐI BÀI
Tuyệt vời! Bạn vừa chinh phục được một kỹ năng cơ bản nhưng quan trọng của lập trình! 🚀
💪 Việc kiểm tra chẵn lẻ tưởng đơn giản nhưng nó xuất hiện rất nhiều trong thực tế: từ thuật toán sắp xếp, mật mã học, đến xử lý dữ liệu lớn!
🌟 Điều đặc biệt: Bạn đã học được cách sử dụng toán tử % – một trong những toán tử mạnh mẽ nhất trong lập trình. Nó sẽ giúp bạn giải quyết vô số bài toán khác!
🎯 Level up: Từ bây giờ, mỗi khi thấy bài toán cần “phân loại” hay “chia nhóm”, hãy nghĩ đến toán tử % nhé!
Tiếp tục hành trình thám hiểm thế giới số học với C++! 🎲✨
🏷️ Tags:
#C++
#kiểm-tra-chẵn-lẻ
#toán-tử-chia-lấy-dư
#modulo-operator
#if-else
#even-odd-check
#input-validation
#bài-tập-thực-hành
#number-theory
#thám-tử-số-học
#dễ-hiểu
#Việt-Nam
#programming-tutorial