Có nhiều cách để đếm số chữ số (digits) của một số nguyên trong C++. Dưới đây là hai phương pháp phổ biến: phương pháp lặp truyền thống và phương pháp toán học dùng logarit.
Phương pháp 1: Lặp chia cho 10 (Truyền thống)
Lặp lại chia số cho 10 cho đến khi bằng 0, đếm số lần lặp.
#include <iostream>
using namespace std;
int count_digits_loop(int number) {
if (number == 0) return 1; // Trường hợp đặc biệt: 0 có 1 chữ số
int count = 0;
number = abs(number); // Xử lý số âm
while (number != 0) {
number /= 10;
count++;
}
return count;
}
int main() {
cout << "1245: " << count_digits_loop(1245) << endl; // 4
cout << "-1245: " << count_digits_loop(-1245) << endl; // 4
cout << "0: " << count_digits_loop(0) << endl; // 1
}
Phương pháp 2: Dùng log10 (Toán học) - Nhanh hơn
Công thức: số_chữ_số = floor(log10(|n|)) + 1
#include <iostream>
#include <cmath>
using namespace std;
int count_digits_log(int number) {
if (number == 0) return 1;
return static_cast<int>(log10(abs(number))) + 1;
}
int main() {
cout << "1245: " << count_digits_log(1245) << endl; // 4
cout << "999: " << count_digits_log(999) << endl; // 3
cout << "1000: " << count_digits_log(1000) << endl; // 4
}
Kết quả cả hai phương pháp
1245: 4 -1245: 4 0: 1
So sánh hai phương pháp
| Tiêu chí | Chia 10 (Loop) | Logarit (log10) |
|---|---|---|
| Độ phức tạp | O(log n) | O(1) |
| Xử lý số âm | Cần abs() | Cần abs() |
| Xử lý 0 | Cần kiểm tra riêng | Cần kiểm tra riêng |
| Độ chính xác | Tuyệt đối | Có thể sai do lỗi float (hiếm) |
| Hiệu năng | Chậm hơn | Nhanh hơn |
Phương pháp 3: Chuyển sang string (C++11)
#include <string>
int count_digits_string(int number) {
string s = to_string(abs(number));
return s.length();
}
Khuyến nghị
- Hiệu năng cao: Dùng
log10(có thêm+ 1e-9để tránh lỗi làm tròn) - Đơn giản, an toàn: Dùng
to_string - Không dùng thư viện math: Dùng vòng lặp chia 10