Finding the length of an integer in C

CIntegerDigit

C Problem Overview


I would like to know how I can find the length of an integer in C.

For instance:

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

and so on.

How can I do this in C?

C Solutions


Solution 1 - C

C:

Why not just take the base-10 log of the absolute value of the number, round it down, and add one? This works for positive and negative numbers that aren't 0, and avoids having to use any string conversion functions.

The log10, abs, and floor functions are provided by math.h. For example:

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

You should wrap this in a clause ensuring that the_integer != 0, since log10(0) returns -HUGE_VAL according to man 3 log.

Additionally, you may want to add one to the final result if the input is negative, if you're interested in the length of the number including its negative sign.

Java:

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

N.B. The floating-point nature of the calculations involved in this method may cause it to be slower than a more direct approach. See the comments for Kangkan's answer for some discussion of efficiency.

Solution 2 - C

If you're interested in a fast and very simple solution, the following might be quickest (this depends on the probability distribution of the numbers in question):

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);
}

While it might not win prizes for the most ingenious solution, it's trivial to understand and also trivial to execute - so it's fast.

On a Q6600 using MSC I benchmarked this with the following loop:

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

This solution takes 0.062s, the second-fastest solution by Pete Kirkham using a smart-logarithm approach takes 0.115s - almost twice as long. However, for numbers around 10000 and below, the smart-log is faster.

At the expense of some clarity, you can more reliably beat smart-log (at least, on a 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;
		}
	}
}

This solution is still 0.062s on large numbers, and degrades to around 0.09s for smaller numbers - faster in both cases than the smart-log approach. (gcc makes faster code; 0.052 for this solution and 0.09s for the smart-log approach).

Solution 3 - C

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

and second one will work for negative numbers too:

int get_int_len_with_negative_too (int value){
  int l=!value;
  while(value){ l++; value/=10; }
  return l;
}

Solution 4 - C

You can write a function like this:

unsigned numDigits(const unsigned n) {
    if (n < 10) return 1;
    return 1 + numDigits(n / 10);
}

Solution 5 - C

length of n:

length =  ( i==0 ) ? 1 : (int)log10(n)+1;

Solution 6 - C

A correct snprintf implementation:

int count = snprintf(NULL, 0, "%i", x);

Solution 7 - C

The number of digits of an integer x is equal to 1 + log10(x). So you can do this:

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

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

Or you can run a loop to count the digits yourself: do integer division by 10 until the number is 0:

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

You have to be a bit careful to return 1 if the integer is 0 in the first solution and you might also want to treat negative integers (work with -x if x < 0).

Solution 8 - C

The most efficient way could possibly be to use a fast logarithm based approach, similar to those used to determine the highest bit set in an integer.

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

This (possibly premature) optimisation takes 0.65s for 20 million calls on my netbook; iterative division like zed_0xff has takes 1.6s, recursive division like Kangkan takes 1.8s, and using floating point functions (Jordan Lewis' code) takes a whopping 6.6s. Using snprintf takes 11.5s, but will give you the size that snprintf requires for any format, not just integers. Jordan reports that the ordering of the timings are not maintained on his processor, which does floating point faster than mine.

The easiest is probably to ask snprintf for the printed length:

#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;
}

Solution 9 - C

Yes, using sprintf.

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

Alternatively, you can do this mathematically using the log10 function.

int num;
scanf("%d",&num);
int length;
if (num == 0) {
  length = 1;
} else {    
  length = log10(fabs(num)) + 1;
  if (num < 0) length++;
}

Solution 10 - C

int digits=1;
    
while (x>=10){
    x/=10;
    digits++;
}
return digits;

Solution 11 - C

sprintf(s, "%d", n);
length_of_int = strlen(s);

Solution 12 - C

You may use this -

(data_type)log10(variable_name)+1

ex:

> len = (int)log10(number)+1;

Solution 13 - C

In this problem , i've used some arithmetic solution . Thanks :)

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

Solution 14 - C

Quite simple

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

Solution 15 - C

keep dividing by ten until you get zero, then just output the number of divisions.

int intLen(int x)
{
  if(!x) return 1;
  int i;
  for(i=0; x!=0; ++i)
  {
    x /= 10;
  }
  return i;
}

Solution 16 - C

This goes for both negative and positive intigers

    int get_len(int n)
    {
        if(n == 0)
        return 1;
       
        if(n < 0)    
        {
           n = n * (-1); // if negative
        }
    
        return  log10(n) + 1;
    }

Same logic goes for loop

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

Solution 17 - C

Why don't you cast your integer to String and get length like this :

int data = 123;
int data_len = String(data).length();

Solution 18 - C

For simple programs...

int num = 456, length=0 // or read value from the user to num
while(num>0){
    num=num/10;
    length++;
}

Use another variable to retain the initial num value.

Solution 19 - C

In my opinion the shortest and easiest solution would be:

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

Solution 20 - C

My way:

Divide as long as number is no more divisible by 10:

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

	return i;
}

I don't know how fast is it in compared with other propositions..

Solution 21 - C

int intlen(int integer){
	int a;
	for(a = 1; integer /= 10; a++);
	return a;
}

Solution 22 - C

A more verbose way would be to use this function.

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

Solution 23 - C

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

I think this method is well suited for this task:

value and answers:

  • -50 -> 3 //it will count - as one character as well if you dont want to count minus then remove counter++ from 5th line.

  • 566666 -> 6

  • 0 -> 1

  • 505 -> 3

Solution 24 - C

Solution

Use the limit where the integer length changes, in the case of the decimal it is a power of 10, and thus use a counter for each verification that the specified integer has not exceeded the limit.

With the math.h dependency:

#include <math.h>

int count_digits_of_integer(unsigned int integer) {
    int count = 1;

    while(1) {
        int limit = pow(10, count);
        if(integer < limit) break;
        count++;

    }

    return count;
}

Without dependency:

int int_pow(int base, int exponent) {
    int potency = base;

    for(int i = 1; i < exponent; i++) potency *= base;

    return potency;

}

int count_digits_of_integer(unsigned int integer) {
    int count = 1;
    
    while(1) {
        int limit = int_pow(10, count);
        if(integer < limit) break;
        count++;

    }
    
    return count;
}

Implementation

#include <stdio.h>

// Copy and paste the solution code here

int main() {
    
    printf("%i -> (%i digits)\n", 0, count_digits_of_integer(0));
    printf("%i -> (%i digits)\n", 12, count_digits_of_integer(12));
    printf("%i -> (%i digits)\n", 34569, count_digits_of_integer(34569));
    printf("%i -> (%i digits)\n", 1234, count_digits_of_integer(1234));
    printf("%i -> (%i digits)\n", 3980000, count_digits_of_integer(3980000));
    printf("%i -> (%i digits)\n", 100, count_digits_of_integer(100));
    printf("%i -> (%i digits)\n", 9, count_digits_of_integer(9));
    printf("%i -> (%i digits)\n", 385784, count_digits_of_integer(385784));
    
    return 0;
}

Output:

0 -> (1 digits)
12 -> (2 digits)
34569 -> (5 digits)
1234 -> (4 digits)
3980000 -> (7 digits)
100 -> (3 digits)
9 -> (1 digits)
385784 -> (6 digits)

Solution 25 - C

Hmm, maybe like this...?

#define _LEN(x) (sizeof(#x)/sizeof(char)-1)

Solution 26 - C

I think I got the most efficient way to find the length of an integer its a very simple and elegant way here it is:

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".
}

Solution 27 - C

int main(void){ unsigned int n, size=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;

}

Solution 28 - C

// Variables 

long c = 2222882;
long b = c;
float x = 10;
int length = 0;

//Loop to know the length

    for(int i = 0; b != 0; i++)
    {
        b = (float) c / x;
        x = x*10;
        length++;
    }
//Print this one
    printf("%i", length);

Solution 29 - C

Kindly find my answer it is in one line code:

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

that is simple and smart! Upvote if you like this!

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionmarabunta2048View Question on Stackoverflow
Solution 1 - CJordan LewisView Answer on Stackoverflow
Solution 2 - CEamon NerbonneView Answer on Stackoverflow
Solution 3 - Czed_0xffView Answer on Stackoverflow
Solution 4 - CKangkanView Answer on Stackoverflow
Solution 5 - CFritz G. MehnerView Answer on Stackoverflow
Solution 6 - Csam hocevarView Answer on Stackoverflow
Solution 7 - CIVladView Answer on Stackoverflow
Solution 8 - CPete KirkhamView Answer on Stackoverflow
Solution 9 - CJamie WongView Answer on Stackoverflow
Solution 10 - CPasiView Answer on Stackoverflow
Solution 11 - COK_or_CANCELView Answer on Stackoverflow
Solution 12 - Cuser7122338View Answer on Stackoverflow
Solution 13 - Cbwass31View Answer on Stackoverflow
Solution 14 - CMauroView Answer on Stackoverflow
Solution 15 - CGraphics NoobView Answer on Stackoverflow
Solution 16 - CDjordjeView Answer on Stackoverflow
Solution 17 - CmanumazuView Answer on Stackoverflow
Solution 18 - CVyshnavView Answer on Stackoverflow
Solution 19 - CFloView Answer on Stackoverflow
Solution 20 - CtBlabsView Answer on Stackoverflow
Solution 21 - CRuzaView Answer on Stackoverflow
Solution 22 - Cuser8622672View Answer on Stackoverflow
Solution 23 - CSa'gear GireeView Answer on Stackoverflow
Solution 24 - CDavid GasparView Answer on Stackoverflow
Solution 25 - CFanCoView Answer on Stackoverflow
Solution 26 - CshiupsView Answer on Stackoverflow
Solution 27 - Cp1r0View Answer on Stackoverflow
Solution 28 - Cwhite_rabbit_0305View Answer on Stackoverflow
Solution 29 - CNasir ShahView Answer on Stackoverflow