tìm kiếm trên internet phổ biến là tạo sai số khi khởi tạo biến số truy cập thành 0 và sau đó nhập kiểm tra vòng lặp trước điều kiện miễn là số không bằng 0. vòng lặp do-while là hoàn hảo để tránh điều này.
unsigned udc(unsigned u) //unsigned digit count
{
unsigned c = 0;
do
++c;
while ((u /= 10) != 0);
return c;
}
nó có thể rẻ hơn để kiểm tra xem u là ít hơn để tránh sự phân chia, tăng, và hướng dẫn cmp uneccessary đối với trường hợp u < .
nhưng trong khi về chủ đề đó, tối ưu hóa, bạn có thể chỉ cần kiểm tra u đối với các quyền hạn liên tục ten.
unsigned udc(unsigned u) //unsigned digit count
{
if (u < 10) return 1;
if (u < 100) return 2;
if (u < 1000) return 3;
//...
return 0; //number was not supported
}
đó giúp bạn tiết kiệm hướng dẫn cho mỗi chữ số, nhưng là ít thích nghi cho radixes khác nhau Inaddition để trở thành không còn hấp dẫn, và tẻ nhạt để viết bằng tay, trong trường hợp bạn muốn viết một thói quen viết các thói quen trước khi chèn nó vào chương trình của bạn. vì C chỉ hỗ trợ số rất hữu hạn, 64bit, 32bit, 16bit, 8bit, bạn có thể chỉ đơn giản là giới hạn mình đến mức tối đa khi tạo thói quen có lợi cho tất cả các kích cỡ.
để giải thích cho số âm, bạn chỉ đơn giản là phủ nhậnu nếu u < trước khi đếm số lượng các chữ số. tất nhiên trước tiên hãy thực hiện hỗ trợ thường lệ đã ký số.
nếu bạn biết rằng u < , nó có thể dễ dàng hơn để chỉ cần viết, thay vì viết các thói quen.
if (u > 99) len = 3;
else
if (u > 9) len = 2;
else len = 1;
Chỉ cần suy nghĩ: Số âm sẽ được xử lý như thế nào? – Joey
Tại sao bạn cần 'std :: string' ở đây? Bạn chỉ có thể làm một 'strlen (buffer_length)'. Bạn cũng không cần '\ n' và do đó không có' -1'. – leemes
Bản sao có thể có của: http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi