Подсчитать общее количество цифр из заданного положительного числа без зацикливания в C - PullRequest
2 голосов
/ 01 июня 2010

Как посчитать общее количество цифр из заданного положительного числа без зацикливания в C?

Ответы [ 4 ]

6 голосов
/ 01 июня 2010

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

TEST:

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

int 
num_digits(unsigned long number)
{
    return (int)(floor(log10((double)number)) + 1.0);
}

int
main(int argc, char **argv)
{
    unsigned long test_numbers[] = {
        1, 9, 10, 99, 100, 999, 1000, 9999, 10000, 99999, 100000, 999999,
        123456789ul,
        999999999ul,
        0
    };

    unsigned long *ptr;
    for(ptr = test_numbers; *ptr; ptr++)
    {
        printf("Number of digits in %lu: %d\n", *ptr, num_digits(*ptr));
    }

    return 0;
}

Выход:

Number of digits in 1: 1
Number of digits in 9: 1
Number of digits in 10: 2
Number of digits in 99: 2
Number of digits in 100: 3
Number of digits in 999: 3
Number of digits in 1000: 4
Number of digits in 9999: 4
Number of digits in 10000: 5
Number of digits in 99999: 5
Number of digits in 100000: 6
Number of digits in 999999: 6
Number of digits in 123456789: 9
Number of digits in 999999999: 9
1 голос
/ 01 июня 2010

Одно из возможных решений, принимая 16-битные целочисленные значения и логические выражения, оцениваемые в 0 или 1. Вы можете заменить условия на (u > 99) ? 1 : 0, если вы беспокоитесь о переносимости.

int digits( unsigned u)
{
    return 1 + (u > 9) + (u > 99) + (u > 999) + (u > 9999);
}
0 голосов
/ 16 августа 2011

return snprintf(0, 0, "%d", num);

0 голосов
/ 01 июня 2010

Два решения для вас!

int digit_count(unsigned int n)
{
   if (n < 10)
      return 1;
   else
      return (1 + digit_count(n / 10));
}

и

   unsigned int n = 50;
   int i = 0;

HACK:
   i++;

   if (n < 10)
   {
      printf("Digits: %d\n", i);
   }
   else
   {
      n /= 10;

      goto HACK;
   }

Не ненавидь меня за последний: (* ​​1007 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...