Mô tả bài toán
Cho số nguyên N, đếm số chữ số (digits).
891452→ 6 chữ số0074515(as string) → 5 chữ số (bỏ leading zeros) hoặc 7 (giữ nguyên string)
Giải pháp 1: Chuyển string + len (đơn giản nhất)
def countDigits(n):
"""Đếm chữ số, tự động bỏ leading zeros nếu n là int."""
return len(str(abs(int(n)))) # abs cho số âm, int bỏ leading zeros
# Test
print(countDigits(891452)) # 6
print(countDigits("0074515")) # 5 (int("0074515") = 74515)
print(countDigits(-123)) # 3
Giải pháp 2: Toán học - chia 10 liên tiếp (cách gốc)
def countDigits(n):
ans = 0
n = abs(int(n)) # xử lý số âm và string
if n == 0:
return 1
while n:
ans += 1
n //= 10
return ans
print(countDigits("45758")) # 5
Giải pháp 3: Logarit (O(1) - nhanh nhất cho số lớn)
import math
def countDigitsLog(n):
n = abs(int(n))
if n == 0:
return 1
return int(math.log10(n)) + 1
print(countDigitsLog(891452)) # 6
So sánh
| Phương pháp | Độ phức tạp | Xử lý edge case | Khuyên dùng |
|---|---|---|---|
| str + len | O(d) | Tốt (auto int conversion) | Đơn giản, đủ nhanh |
| While loop | O(d) | Cần handle 0, âm | Giáo dục |
| math.log10 | O(1) | Cần handle 0, âm | Số rất lớn, performance critical |
Lưu ý: Code gốc có bug: n = "45758" truyền string vào while n: -> infinite loop (string non-empty always True). Cần int(n) trước.