Нахождение длины целого числа в C

Я хотел бы знать, как я могу найти длину целого числа в C.

Например:

  • 1 => 1
  • 25 => 2
  • 12512 => 5
  • 0 => 1

и так далее.

Как я могу сделать это на C?


person marabunta2048    schedule 18.06.2010    source источник
comment
Каково определение длины, если целое число равно 0? Отрицательный?   -  person kennytm    schedule 18.06.2010
comment
См. stackoverflow.com/questions/679602/. Это почти дубликат, но не точный, поскольку это вопрос .NET.   -  person ChrisF    schedule 18.06.2010
comment
правильный вопрос - это не длина целого числа, а минимальное количество десятичных цифр, необходимых для представления этого числа (содержащегося в C int). log10 - ваш друг: log10 (10000) = 4, +1 количество цифр (log10 должно быть усечено) ... если число отрицательное, вам понадобится еще один для символа -, если вы хотите его посчитать, и log10 (-num) (поскольку журнал отрицательного числа проблематичен.   -  person ShinTakezou    schedule 18.06.2010
comment
Насколько вы уверены, что log10(10000) вернет 4, а не 3.999999 ...?   -  person Keith Thompson    schedule 29.08.2011
comment
Хм. Эксперимент показывает, что log10(10**n) дает точное значение для степеней 10 от 1 до 2 ** 19, по крайней мере, с gcc и glibc. Но я бы не стал рассчитывать на это для всех реализаций. (** обозначает возведение в степень; в C. нет такого оператора)   -  person Keith Thompson    schedule 29.08.2011
comment
Итак, какой ответ принимается в качестве ответа?   -  person Kangkan    schedule 25.09.2013
comment
Дубликат: stackoverflow.com/questions/1068849/   -  person A Person    schedule 10.01.2014
comment
@APerson Эй! Я просто пометил этот же вопрос как повторяющийся. Вы тоже должны быть человеком.   -  person APerson    schedule 01.11.2014
comment
На секунду мне почти показалось, что я попал на Code Golf вместо SO.   -  person sportzpikachu    schedule 20.03.2020


Ответы (23)


C:

Почему бы просто не взять десятичный логарифм абсолютного значения числа, округлить его в меньшую сторону и добавить единицу? Это работает для положительных и отрицательных чисел, отличных от 0, и позволяет избежать использования каких-либо функций преобразования строк.

Функции log10, abs и floor предоставляются math.h. Например:

int nDigits = floor(log10(abs(the_integer))) + 1;

Вы должны заключить это в предложение, гарантирующее, что the_integer != 0, поскольку log10(0) возвращает -HUGE_VAL согласно man 3 log.

Кроме того, вы можете добавить единицу к окончательному результату, если ввод отрицательный, если вас интересует длина числа, включая его отрицательный знак.

Ява:

int nDigits = Math.floor(Math.log10(Math.abs(the_integer))) + 1;

N.B. Из-за того, что в этом методе используются вычисления с плавающей запятой, он может быть медленнее, чем при более прямом подходе. См. Комментарии к ответу Кангкана для обсуждения эффективности.

person Jordan Lewis    schedule 18.06.2010
comment
На самом деле вы должны использовать пол и добавить вместо него 1. Math.Ceil (Math.Log (99)) = 2, но Math.Ceil (Math.Log (10)) = 1. Math.Floor (Math.Log (99)) + 1 = 2 и Math.Floor (Math. Журнал (10)) = 2 - person Sani Singh Huttunen; 18.06.2010
comment
Вопрос не совсем ясен в определении длины (так что вы, возможно, могли подумать «количество цифр, исключая ведущие нули»), но я бы ожидал, что 0 и -1 вернут 1 и 2 как длину их символьного представления, а чем -2147483648 и 1. - person Pete Kirkham; 18.06.2010
comment
@Pete Спасибо, что напомнили мне об ограничении домена журнала и регистре отрицательных чисел - я отредактировал свой ответ. - person Jordan Lewis; 18.06.2010
comment
+1 красиво и коротко - это мой предпочтительный ответ, даже если он самый медленный - в конце концов, разница в скорости не велика, и такой код вряд ли будет перфомансом. все равно узкое место. - person Eamon Nerbonne; 18.06.2010
comment
+1 за примечание (и следующие комментарии) об эффективности. Каждый программист действительно должен знать основы математики, но также должен знать, что иногда математика не самый быстрый путь благодаря чертовски быстрым двоичным процессорам. Говоря о C, это может легко стать узким местом. - person cregox; 06.02.2014
comment
Это не работает для 999999999999999999, целого числа C, которое будет преобразовано в большее двойное значение и, таким образом, приведет к ошибочному подсчету цифр. OP не указал int, только целое число. - person chqrlie; 24.11.2015
comment
Что касается случая == 0, вот однострочник: (the_integer == 0 ? 1 : (int)floor(log10(abs(the_integer))) + 1) - person luckydonald; 22.11.2016
comment
Сладкий! Для большого количества я изменил так: long long nDigits = floor(log10(llabs(the_integer))) + 1; - person protoEvangelion; 27.03.2017
comment
abs предоставляется stdlib, а не математикой - person Ace.C; 20.04.2020

Если вас интересует быстрое и очень простое решение, наиболее быстрым может быть следующее (это зависит от распределения вероятностей рассматриваемых чисел):

int lenHelper(unsigned x) {
    if (x >= 1000000000) return 10;
    if (x >= 100000000)  return 9;
    if (x >= 10000000)   return 8;
    if (x >= 1000000)    return 7;
    if (x >= 100000)     return 6;
    if (x >= 10000)      return 5;
    if (x >= 1000)       return 4;
    if (x >= 100)        return 3;
    if (x >= 10)         return 2;
    return 1;
}

int printLen(int x) {
    return x < 0 ? lenHelper(-x) + 1 : lenHelper(x);
}

Хотя за самое оригинальное решение он может и не получить призов, его легко понять и также легко выполнить - так что это быстро.

На Q6600, использующем MSC, я проверил это с помощью следующего цикла:

int res = 0;
for(int i = -2000000000; i < 2000000000; i += 200) res += printLen(i);

Это решение занимает 0,062 с, второе по скорости решение Пита Киркхэма, использующее подход интеллектуального логарифма, занимает 0,115 с - почти в два раза дольше. Однако для чисел около 10000 и ниже смарт-журнал работает быстрее.

За счет некоторой наглядности можно более надежно обыграть smart-log (по крайней мере, на Q6600):

int lenHelper(unsigned x) { 
    // this is either a fun exercise in optimization 
    // or it's extremely premature optimization.
    if(x >= 100000) {
        if(x >= 10000000) {
            if(x >= 1000000000) return 10;
            if(x >= 100000000) return 9;
            return 8;
        }
        if(x >= 1000000) return 7;
        return 6;
    } else {
        if(x >= 1000) {
            if(x >= 10000) return 5;
            return 4;
        } else {
            if(x >= 100) return 3;
            if(x >= 10) return 2;
            return 1;
        }
    }
}

Это решение по-прежнему составляет 0,062 с для больших чисел и снижается до 0,09 с для меньших чисел - быстрее в обоих случаях, чем подход интеллектуального журнала. (gcc делает код быстрее; 0,052 для этого решения и 0,09 с для подхода с умным журналом).

person Eamon Nerbonne    schedule 18.06.2010
comment
Мне страшно подумать, как будет выглядеть вторая версия, полностью написанная с тернарным оператором ... - person Eamon Nerbonne; 18.06.2010
comment
Если бы это использовалось для пережевывания длинных списков чисел, количество разветвленного кода вызвало бы хаос с CPUs branch prediction and not produce the fastest execution Im. - person Lloyd Crawley; 23.10.2013
comment
В моем тесте это по-прежнему самое быстрое решение - обратите внимание, что для всех других интегральных решений также требуется несколько ветвей, и единственной реальной альтернативой является преобразование int в double с журналом с плавающей запятой (что, как оказалось, тоже недешево) . - person Eamon Nerbonne; 23.10.2013
comment
@earthdan: это решение в порядке, но довольно медленно из-за разделения. Он также всегда использует больше ветвей, чем вторая версия этого кода, и в среднем больше, чем первое решение, размещенное здесь. Кроме того, это решение довольно умное (в плохом смысле) в том смысле, что причина его работы не совсем очевидна. Если вам нужно краткое и очевидное решение, используйте stackoverflow.com/a/3068412/42921; если вам нужно быстрое и очевидное решение, используйте это. Не могу представить себе вариант использования stackoverflow.com/a/6655759/2382629 (хотя это, конечно, забавное интеллектуальное упражнение. !) - person Eamon Nerbonne; 17.03.2014

int get_int_len (int value){
  int l=1;
  while(value>9){ l++; value/=10; }
  return l;
}

а второй будет работать и с отрицательными числами:

int get_int_len_with_negative_too (int value){
  int l=!value;
  while(value){ l++; value/=10; }
  return l;
}
person zed_0xff    schedule 18.06.2010
comment
Мне это нравится. Никаких временных символьных буферов с предположениями о размере. - person Noufal Ibrahim; 18.06.2010
comment
Однако быстро и элегантно это не сработает для отрицательных чисел. Не знаю, беспокоит ли это плакат с вопросом - person Jamie Wong; 18.06.2010
comment
будет. попробуйте. он вернет 1 - person zed_0xff; 19.06.2010
comment
Вы правы - действительно будет :-). Для меня было бы яснее (и не медленнее) различать этот случай с помощью if-return, а не отрицания. - person Eamon Nerbonne; 21.06.2010

Вы можете написать такую ​​функцию:

unsigned numDigits(const unsigned n) {
    if (n < 10) return 1;
    return 1 + numDigits(n / 10);
}
person Kangkan    schedule 18.06.2010
comment
Это излишне неэффективно - зачем использовать до 18 рекурсивных вызовов функций, если вы можете сделать это одним вызовом log10? - person Jordan Lewis; 18.06.2010
comment
но сделать его не рекурсивным в некоторых случаях, в зависимости от процессора и наличия сопроцессора с плавающей запятой, может быть быстрее, чем при использовании такой функции, как log10 - person ShinTakezou; 18.06.2010
comment
@ Джордан Льюис, звонящий 20 миллионов раз, на моем нетбуке занимает 1,8 секунды; вызов вашего кода занимает 6,6 секунды (gcc -O3 для обоих). Один вызов log10 выполняется намного медленнее, чем все его рекурсивные вызовы. - person Pete Kirkham; 18.06.2010
comment
@Pete Я вижу .001s для версии log10 и .44s для рекурсивной версии на моем Intel i7 20 миллионов раз с -O3. - person Jordan Lewis; 18.06.2010
comment
Простая рекурсивная форма. Мне это нравится. - person Cheery; 18.06.2010
comment
@Jordan, вы называете это с одинаковыми или разными значениями? `int c = 0; for (int i = -10000000; i ‹10000000; ++ i) c + = print_length (i); printf (всего% d \ n, c); ` - person Pete Kirkham; 18.06.2010
comment
@Pete Я выполнял итерацию от i = 0 до 2 миллионов, а также использовал i в качестве параметра для print_length. Я попробую еще раз с вашими параметрами, включая + =. - person Jordan Lewis; 18.06.2010
comment
Ну, наверняка вы не использовали эту реализацию numDigits для отрицательных значений, поскольку она не обрабатывает отрицательные значения? - person Jordan Lewis; 18.06.2010
comment
@Pete и @Jordan благодарит за то, что ввели контекст эффективности. Я предложил свой ответ, глядя на простоту. - person Kangkan; 18.06.2010
comment
@Jordan Я добавил if ( x < 0 ) return 1 + printed_length ( -x ); в начало - person Pete Kirkham; 18.06.2010
comment
@Pete Я, должно быть, сделал ошибку, из-за которой компилятор раньше оптимизировал фактические вызовы. Теперь я наблюдаю такой же промежуток, как ваш - 0,26 секунды для рекурсивной версии и 1,68 секунды для версии с арифметикой с плавающей запятой. Интересный! - person Jordan Lewis; 18.06.2010
comment
Вполне возможно, что рекурсивная версия менее рекурсивна, чем она выглядит после компиляции - в зависимости от версии / параметров, gcc будет частично разворачивать короткие рекурсивные вызовы, подобные этому; здесь это особенно просто, так как это хвостовой вызов. - person Eamon Nerbonne; 18.06.2010
comment
@Eamon Nerbonne, часть 1 + перестает быть банальным хвостовым вызовом. - person Pete Kirkham; 18.06.2010
comment
@ Пит: действительно; нетривиально; по-прежнему неотъемлемая часть; и с максимальной глубиной около дюжины встраивание будет работать хорошо. - person Eamon Nerbonne; 18.06.2010
comment
gcc разворачивает его (по крайней мере, gcc 4.8) 16 инструкций с -O2, так что это действительно лучшее решение, даже лучше, чем log, и лучше, чем помощник len, который имеет много сравнений (ключевое слово: предсказание ветвления) - person hellow; 24.05.2013
comment
@Jordan Lewis похоже, что ни log () / floor, ни logl () / floorl () не будут работать с длинными целыми числами. здесь тест: минимальное длинное целое число со знаком в этой системе: -9223372036854775808 максимальное длинное целое число со знаком в этой системе: 9223372036854775807 get_num_len2 () i = -9223372036854775808 len = -2147483648 get_num_len2 () i207 = -933522 - person 0x0C4; 01.11.2016

длина n:

length =  ( i==0 ) ? 1 : (int)log10(n)+1;
person Fritz G. Mehner    schedule 18.06.2010
comment
Вероятно, вам следует избегать округления с помощью кастинга и вместо этого использовать более явный (также известный как переносимый и последовательный) подход к округлению. - person Chris Lutz; 18.06.2010
comment
как casting реализовано? как можно реализовать такую ​​функцию, как пол? (мы предполагаем, что процессор с ieee в аппаратном обеспечении, или через математический сопроцессор, или доступность программной функции для выполнения той же функции, которая обычно присутствует на процессорах с поддержкой FP) ... в конце (int) является переносимым и согласованным в в большинстве случаев (осмелюсь сказать, во всех случаях, о которых мы обычно заботимся) - person ShinTakezou; 18.06.2010
comment
Как упоминалось в других сообщениях, это не удастся, когда n = 0 - person Jamie Wong; 18.06.2010
comment
@Lutz: какую переносимость вы покупаете, предполагая, что приведение от double к int не определено? Есть ли на самом деле соответствующая платформа, где это так? - person Eamon Nerbonne; 18.06.2010
comment
@Chris Lutz Если это реализация C, соответствующая стандартам, то она подчиняется Когда конечное значение реального плавающего типа преобразуется в целочисленный тип, отличный от _Bool, дробная часть отбрасывается (т. Е. Значение обрезается до нуля) . - person Pete Kirkham; 18.06.2010
comment
@Pete, @Eamon - Мне плохо. Я думал, что это не определено или определена реализация. - person Chris Lutz; 19.06.2010

Количество цифр целого числа x равно 1 + log10(x). Итак, вы можете сделать это:

#include <math.h>
#include <stdio.h>

int main()
{
    int x;
    scanf("%d", &x);
    printf("x has %d digits\n", 1 + (int)log10(x));
}

Или вы можете запустить цикл для самостоятельного подсчета цифр: делайте целочисленное деление на 10, пока число не станет 0:

int numDigits = 0;
do
{
    ++numDigits;
    x = x / 10;
} while ( x );

Вы должны быть немного осторожны, чтобы вернуть 1, если целое число 0 в первом решении, и вы также можете обрабатывать отрицательные целые числа (работайте с -x, если x < 0).

person IVlad    schedule 18.06.2010
comment
Да, красивый простой do цикл. - person chux - Reinstate Monica; 24.11.2015

Наиболее эффективным способом могло бы быть использование подхода, основанного на быстром логарифме, аналогичного тем, которые используются для определения наивысшего набора битов в целых числах.

size_t printed_length ( int32_t x )
{
    size_t count = x < 0 ? 2 : 1;

    if ( x < 0 ) x = -x;

    if ( x >= 100000000 ) {
        count += 8;
        x /= 100000000;
    }

    if ( x >= 10000 ) {
        count += 4;
        x /= 10000;
    }

    if ( x >= 100 ) {
        count += 2;
        x /= 100;
    }

    if ( x >= 10 )
        ++count;

    return count;
}

Эта (возможно, преждевременная) оптимизация занимает 0,65 секунды для 20 миллионов вызовов на моем нетбуке; итеративное деление, такое как zed_0xff, занимает 1,6 секунды, рекурсивное деление, такое как Kangkan, занимает 1,8 секунды, а использование функций с плавающей запятой (код Джордана Льюиса) занимает колоссальные 6,6 секунды. Использование snprintf занимает 11,5 с, но даст вам размер, который требуется snprintf для любого формата, а не только для целых чисел. Джордан сообщает, что порядок таймингов не поддерживается на его процессоре, который работает с плавающей запятой быстрее, чем мой.

Проще всего, вероятно, спросить у snprintf напечатанную длину:

#include <stdio.h>

size_t printed_length ( int x )
{
    return snprintf ( NULL, 0, "%d", x );
}

int main ()
{
    int x[] = { 1, 25, 12512, 0, -15 };

    for ( int i = 0; i < sizeof ( x ) / sizeof ( x[0] ); ++i )
        printf ( "%d -> %d\n", x[i], printed_length ( x[i] ) );

    return 0;
}
person Pete Kirkham    schedule 18.06.2010
comment
Если вы собираетесь использовать snprintf(), почему бы не snprintf(NULL, 0, "%d", x) и ничего не писать? (По крайней мере, используйте в своей функции статический буфер.) - person Chris Lutz; 18.06.2010
comment
потому что сегодня утром я еще не выпил достаточно кофе и думал о первой части ответа. - person Pete Kirkham; 18.06.2010
comment
Если разделить ваши ответы на два сообщения, я бы поставил +1 первому, но не второму. - person Blindy; 18.06.2010
comment
Это скорее зависит от того, почему вам нужна длина - если вы хотите знать, сколько символов потребуется snprintf, вам лучше использовать snprintf; если вам нужен глупо оптимизированный код, вам может понадобиться первый. - person Pete Kirkham; 18.06.2010
comment
C99 позволяет str иметь значение NULL в этом случае [случай n == 0] и дает возвращаемое значение (как всегда) как количество символов, которые были бы записаны в случае, если выходная строка была достаточно большой, поэтому она хорошо Почему бы и нет - person ShinTakezou; 18.06.2010
comment
(А ... Я полагаю, ответ был изменен после предложения Лутца ...?) - person ShinTakezou; 18.06.2010
comment
Ваше решение не работает для INT_MIN. Используйте для тестов локальную unsigned переменную и инициализируйте ее с помощью x >= 0 ? x : -(unsigned)x - person chqrlie; 24.11.2015

Правильная snprintf реализация:

int count = snprintf(NULL, 0, "%i", x);
person sam hocevar    schedule 09.04.2011
comment
Что произойдет, если x отрицателен? - person Immanuel Weihnachten; 29.01.2016
comment
Тогда count будет иметь одну дополнительную единицу для знака минус. - person sam hocevar; 30.01.2016

Да, используя sprintf.

int num;
scanf("%d",&num);
char testing[100];
sprintf(testing,"%d",num);
int length = strlen(testing);

В качестве альтернативы вы можете сделать это математически, используя функцию log10.

int num;
scanf("%d",&num);
int length;
if (num == 0) {
  length = 1;
} else {    
  length = log10(fabs(num)) + 1;
  if (num < 0) length++;
}
person Jamie Wong    schedule 18.06.2010
comment
Нет, на самом деле это довольно опасно и подвержено ошибкам. Вы должны использовать snprintf(), чтобы вам не пришлось ничего писать (и рисковать переполнением). - person Chris Lutz; 18.06.2010
comment
Предполагая, что он имел в виду целое число C (а не тип bignum), проблем с переполнением не возникнет. - person Jamie Wong; 18.06.2010
comment
Когда компьютеры станут больше, возникнут проблемы. Конечно, вам понадобится 512-битный компьютер, чтобы взломать ваш код, но они, вероятно, когда-нибудь его сделают. - person Chris Lutz; 18.06.2010
comment
нет, вероятно, 128 бит будет последней границей ... не будет никаких причин выходить за рамки (преувеличивая, я говорю, что нет причин выходить за рамки 64 бит, но я уже почти ошибаюсь , но в настоящее время пока нет реальных 128-битных процессоров, и они вряд ли будут, по крайней мере, в потребительских вычислениях ... Я надеюсь, раз они будут нуждаться в них, это будет означать, что ОС будет слишком толстой, и мы вспомним эти дни как лучшие дни) - person ShinTakezou; 18.06.2010
comment
вы можете просто использовать возвращаемое значение sprintf() без вызова strlen() - person phuclv; 14.03.2015

В этой задаче я использовал арифметическое решение. Спасибо :)

int main(void)
{
    int n, x = 10, i = 1;
    scanf("%d", &n);
    while(n / x > 0)
    {
        x*=10;
        i++;
    }
    printf("the number contains %d digits\n", i);

    return 0;
}
person wassdz31    schedule 05.12.2020

Вы можете использовать это -

(тип_данных) log10 (имя_переменной) +1

ex:

len = (int) log10 (число) +1;

person Community    schedule 31.01.2017

Довольно просто

int main() {
    int num = 123;
    char buf[50];

    // convert 123 to string [buf]
    itoa(num, buf, 10);

    // print our string
    printf("%s\n", strlen (buf));

    return 0;
}
person Mauro    schedule 18.06.2010
comment
это может быть легко написано однако - person ShinTakezou; 18.06.2010

делите на десять, пока не получите ноль, а затем просто выведите количество делений.

int intLen(int x)
{
  if(!x) return 1;
  int i;
  for(i=0; x!=0; ++i)
  {
    x /= 10;
  }
  return i;
}
person Graphics Noob    schedule 18.06.2010
comment
Это неверно. Это вернет произвольное число, если x = 0. - person Jamie Wong; 18.06.2010
comment
Спорим, не будет ... Однако он вернет неправильное значение для 0. - person Blindy; 18.06.2010
comment
@phleet, я почти уверен, что точка с запятой после i = 0 - это точка последовательности, но ноль по-прежнему неправильный вывод. Но теперь это исправлено. - person Graphics Noob; 18.06.2010

Это касается как отрицательных, так и положительных результатов.

    int get_len(int n)
    {
        if(n == 0)
        return 1;

        if(n < 0)    
        {
           n = n * (-1); // if negative
        }

        return  log10(n) + 1;
    }

Та же логика и для цикла

  int get_len(int n)
  {
       if(n == 0)
       return 1;

       int len = 0;
       if(n < 0)
       n = n * (-1);

       while(n > 1)
       {
          n /= 10;
          len++;
       }

       return len;
  }
person Djordje    schedule 23.10.2018

Почему бы вам не преобразовать целое число в String и не получить такую ​​длину:

int data = 123;
int data_len = String(data).length();
person manumazu    schedule 02.02.2021

На мой взгляд, самым коротким и простым решением было бы:

int length , n;

printf("Enter a number: ");

scanf("%d", &n);

length = 0;

while (n > 0) {
   n = n / 10;
   length++;
}

printf("Length of the number: %d", length);
person Flo    schedule 04.01.2014
comment
Если (n) равно 0, это вернет длину (n) как 0. Используйте do...while, чтобы цикл выполнялся один раз, когда (n) равно 0. - person Kevin Fegan; 11.01.2014

Мой метод:

Разделите, пока число не делится на 10:

u8 NumberOfDigits(u32 number)
{
    u8 i = 1;
    while (number /= 10) i++;

    return i;
}

Я не знаю, насколько это быстро по сравнению с другими предложениями ..

person tBlabs    schedule 12.09.2014

Более подробным способом было бы использовать эту функцию.

int length(int n)
{
    bool stop;
    int nDigits = 0;
    int dividend = 1;
    do
    {
        stop = false;
        if (n > dividend)
        {
            nDigits = nDigits + 1;
            dividend = dividend * 10;
        }
        else {
            stop = true;
        }


    }
    while (stop == false);
    return nDigits;
}
person Community    schedule 18.08.2018

int returnIntLength(int value){
    int counter = 0;
    if(value < 0)
    {
        counter++;
        value = -value;
    }
    else if(value == 0)
        return 1;

    while(value > 0){
        value /= 10;
        counter++;
    }

    return counter;
}

Думаю, этот метод хорошо подходит для этой задачи:

значение и ответы:

  • -50 -> 3 // он будет считаться - также как один символ, если вы не хотите считать минус, удалите счетчик ++ из 5-й строки.

  • 566666 -> 6

  • 0 -> 1

  • 505 -> 3

person Sa'gear Giree    schedule 25.12.2018

Я думаю, что у меня есть наиболее эффективный способ найти длину целого числа, это очень простой и элегантный способ:

int PEMath::LengthOfNum(int Num)
{
int count = 1;  //count starts at one because its the minumum amount of digits posible
if (Num < 0)
{
    Num *= (-1);
}

for(int i = 10; i <= Num; i*=10)
{
     count++;
}      
return count;
                // this loop will loop until the number "i" is bigger then "Num"
                // if "i" is less then "Num" multiply "i" by 10 and increase count
                // when the loop ends the number of count is the length of "Num".
}
person shiups    schedule 19.05.2013
comment
Num *= (-1) кажется немного тяжеловесным, хотя ваш компилятор, вероятно, оптимизирует его до гораздо более эффективного Num = -Num. Обратите внимание, что умножение часто бывает дорогостоящей операцией, тогда как отрицание целого числа довольно тривиально. - person Arunas; 10.10.2013
comment
Не код C. Не работает для INT_MIN, не работает и для INT_MAX, фактически не работает для чисел, больших или равных наибольшей степени 10 меньше INT_MAX, например 1000000000 для int32_t. - person chqrlie; 24.11.2015

int main (void) {unsigned int n, размер = 0;

printf("get the int:");
scanf("%u",&n);

/*the magic*/
for(int i = 1; n >= i; i*=10){
    size++;
}

printf("the value is: %u \n", n);
printf("the size is: %u \n", size);

return 0;

}

person p1r0    schedule 13.09.2018

Пожалуйста, найдите мой ответ в однострочном коде:

#include <stdio.h> int main(void){ int c = 12388884; printf("length of integer is: %d",printf("%d",c)); return 0; }

это просто и умно! Проголосуйте, если вам это нравится!

person Nasir Shah    schedule 08.01.2019
comment
Кажется, ваше решение также печатает само число, а не только его длину! - person Eduardo; 16.08.2019

person    schedule
comment
Добавьте контекст к своему ответу, чтобы другие могли легко понять ваш подход. - person Pawara Siriwardhane; 24.04.2021