2012-06-22 48 views
15

Làm thế nào để phát hiện độ dài của một số nguyên? trong trường hợp tôi có le: int test (234567545);Lấy số chữ số trong một số

làm cách nào để biết khoảng thời gian của int? như nói với tôi có 9 số bên trong nó ???

tôi đã cố gắng:

char buffer_length[100]; 


    // assign directly to a string. 

    sprintf(buffer_length, "%d\n", 234567545); 

    string sf = buffer_length; 


    cout <<sf.length()-1 << endl; 

nhưng hầu hết là một cách đơn giản hơn để làm việc đó hoặc sạch hơn ...

+5

Chỉ cần suy nghĩ: Số âm sẽ được xử lý như thế nào? – Joey

+1

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

+0

Bản sao có thể có của: http://stackoverflow.com/questions/1489830/efficient-way-to-determine-number-of-digits-in-an-integer – Rishi

Trả lời

27

Làm thế nào về bộ phận:

int length = 1; 
int x = 234567545; 
while (x /= 10) 
    length++; 

hoặc sử dụng phương pháp log10 từ <math.h>.

Lưu ý rằng log10 trả về double, vì vậy bạn sẽ phải điều chỉnh kết quả.

+0

Cảm ơn! :) chỉ cần những gì tôi cần biết – user1417815

+0

Sẽ chấp nhận trong 6 phút, vì nó nói như vậy :) – user1417815

+2

Lưu ý, 'log (0)' là –infinity và chuyển đổi thành một số nguyên là UB. – Potatoswatter

10

Thực hiện một chức năng:

int count_numbers (int num) { 
    int count =0; 
    while (num !=0) { 
     count++; 
     num/=10; 
    } 
    return count; 
} 
+3

Điều này cho kết quả sai nếu num == 0. –

+2

Tôi nghĩ rằng chúng ta có thể thêm một đơn giản nếu trước đây trong khi –

+1

Chức năng của bạn hoạt động, nhưng .. ..little trễ .. anyway mà không giữ tôi từ cho bạn 1! – user1417815

3

nếu "i" là số nguyên, sau đó

int len ; 

char buf[33] ; 

itoa (i, buf, 10) ; // or maybe 16 if you want base-16 ? 

len = strlen(buf) ; 

if(i < 0) 
    len-- ; // maybe if you don't want to include "-" in length ? 
+0

'buf [12]' phải đủ (tối đa 10 chữ số + dấu + '\ 0'). – leemes

2

Bạn có thể sử dụng stringstream cho điều này như hình dưới đây

stringstream ss; 
int i = 234567545; 
ss << i; 
cout << ss.str().size() << endl; 
+0

Nó sẽ hoạt động, nhưng nó không hiệu quả. –

3
#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 

int main() { 

    int i=2384995; 
    char buf[100]; 

    itoa(i, buf, 10); // 10 is the base decimal 

    printf("Lenght: %d\n", strlen(buf)); 


    return 0; 
} 

Hãy coi chừng itoa không phải là một chức năng tiêu chuẩn, ngay cả khi nó được hỗ trợ bởi nhiều trình biên dịch.

+0

'buf [12]' phải đủ (tối đa 10 chữ số + dấu + '\ 0'). – leemes

0

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; 
4

Không ai có vẻ đã đề cập chuyển đổi nó thành chuỗi và sau đó nhận được độ dài. Tôi không chắc chắn như thế nào performant này, nhưng nó chắc chắn làm nó trong một dòng mã :)

int num = 123456; 
int len = to_string(num).length(); 

cout << "LENGTH of " << num << " is " << len << endl; 
// prints "LENGTH of 123456 is 6" 
-1

len = 1 + sàn (log10 (n)); // mã C++ lib (cmath)

+0

Tại sao không có tình yêu với số lượng nghèo '0'? –

Các vấn đề liên quan