2015-11-03 2 views
-1

В Java, я используюНайти длину целого числа в C++

int length = String.valueOf(input).length(); 

найти длину целого.

Мой вопрос: есть ли подобные способы сделать это на C++? я уже пробовал для петель и в то время как петли, такие как:

while (input > 0){ 
    input/=10; 
    count++; 

Так, кроме петель есть что-нибудь еще доступны в C++. Спасибо за ваш ответ.

+0

http://en.cppreference.com/w/cpp/string/basic_string/to_string –

+0

@CrakC - Я уже сказал, нет петель. – Raphael

+0

@ н.м. - Не могли бы вы привести пример? Если возможно. – Raphael

ответ

6

Если вы хотите точный аналог того, что вы написали в Java, вы можете использовать:

int length = to_string(input).length(); 

Обратите внимание, что to_string является функция С ++ 11. Кроме того, будьте осторожны с отрицательными числами.

+0

Я не думаю, что OP интересует C++ 11, потому что вопрос не помечен так! – CinCout

+2

@HappyCoder: или тот факт, что тег C++ 11 не появляется автоматически много раз. Я думаю, что если человек этого не хочет, он должен явно указать его. Но даже тогда спасибо за ваши взгляды :) – therainmaker

+1

Даже если ответ не соответствует требованиям OP, я думаю, что он может быть полезен другим пользователям с C++ 11. –

2

unsigned int number_of_digits = 0;

do { ++ number_of_digits; n/= основание; } while (n);

// n - ваш базовый номер.

+5

** «Итак, кроме петель» ** –

+0

Благодарим за помощь! – Raphael

1

Говоря о pre-C++ 11, вы можете использовать тот же подход, но с sprintf.

Преобразовать целое число в массив символов, а затем получить его длину:

char buffer[30]; 

int length = sprintf(buffer, "%d", input); 

Вот working IDEOne example.

+0

Благодарим за помощь! – Raphael

3

Количество цифр может быть вычислено без преобразования в строку сначала с помощью логарифм этого числа:

std::size_t intlen(int i) { 
    if (i == 0) return 1; 
    else if (i < 0) return 2 + static_cast<std::size_t>(std::log10(-i)); 
    else if (i > 0) return 1 + static_cast<std::size_t>(std::log10(i)); 
} 

logartihm определяется только для положительных чисел, так негативов и ноль должны быть обработаны по отдельности, считая знак - в качестве дополнительного символа. Замените log10 на log2, чтобы получить число двоичных цифр (это возможно для любой базы).

Однако здесь следует отметить, что преобразование в строки первого (например, с помощью std::to_string) является Локальнозависимой операцией и может, таким образом, дают разные результаты для различных языковых настроек - некоторые локали вставить разделитель тысяч (например, 100,000), который не будет отображаться с использованием приведенная выше формула.

+0

Благодарим за помощь! – Raphael

2

Помимо петель есть рекурсия. Например, для положительных чисел вы можете сделать:

unsigned int len(unsigned int n) 
{ 
    return n ? len(n/10)+1 : 0; 
} 
+0

Благодарим за помощь! – Raphael

Смежные вопросы