Mô tả bài toán
Viết hàm đảo ngược thứ tự chữ số của một số nguyên dương sử dụng vòng lặp while (phép lặp - iterative).
Thuật toán
Đầu vào: số nguyên n
Khởi tạo: reverse = 0
Khi n > 0:
reverse = reverse * 10 + n % 10 // Thêm chữ số cuối vào reverse
n = n / 10 // Bỏ chữ số cuối của n
Trả về reverse
Ví dụ minh họa (n = 356789)
| Bước | n | n % 10 | reverse (trước) | reverse = reverse*10 + n%10 |
|---|---|---|---|---|
| 1 | 356789 | 9 | 0 | 9 |
| 2 | 35678 | 8 | 9 | 98 |
| 3 | 3567 | 7 | 98 | 987 |
| 4 | 356 | 6 | 987 | 9876 |
| 5 | 35 | 5 | 9876 | 98765 |
| 6 | 3 | 3 | 98765 | 987653 |
| 7 | 0 | - | - | Dừng |
Chương trình C
#include <stdio.h>
// Hàm đảo ngược số nguyên
int daoNguoc(int so) {
int dao = 0;
while (so > 0) {
dao = dao * 10 + so % 10;
so = so / 10;
}
return dao;
}
int main() {
int so;
printf("Nhap mot so nguyen: ");
scanf("%d", &so);
printf("So dao nguoc: %d\n", daoNguoc(so));
return 0;
}
Kết quả
Nhap mot so nguyen: 356789
So dao nguoc: 987653
Xử lý các trường hợp đặc biệt
// Xử lý số âm
int daoNguoc(int so) {
int dau = 1;
if (so < 0) {
dau = -1;
so = -so; // Làm dương
}
int dao = 0;
while (so > 0) {
dao = dao * 10 + so % 10;
so /= 10;
}
return dao * dau;
}
// Xử lý số kết thúc bằng 0 (ví dụ: 1200 -> 21, không phải 0021)
int daoNguoc(int so) {
int dao = 0;
while (so > 0) {
dao = dao * 10 + so % 10;
so /= 10;
}
return dao; // Tự động bỏ các số 0 đầu
}
So sánh: Iterative vs Recursive
| Đặc điểm | Iterative (Vòng lặp) | Recursive (Đệ quy) |
|---|---|---|
| Bộ nhớ stack | O(1) - Hằng số | O(log n) - Theo số chữ số |
| Hiệu năng | Nhanh hơn | Chậm hơn (overhead gọi hàm) |
| Dễ hiểu | Trực quan | Tư duy toán học |
| Rủi ro | Không tràn stack | Có thể tràn stack nếu số lớn |
Khuyến nghị: Dùng vòng lặp (iterative) cho bài toán đảo ngược số vì đơn giản, hiệu quả và an toàn hơn.