Подтвердить что ты не робот

Как я могу подсчитать цифры в целых числах без строки?

Я боюсь там простого и очевидного ответа на этот вопрос. Мне нужно определить, сколько цифр содержит количество элементов, так что я могу разместить каждый номер позиции с минимальным количеством начальных нулей, необходимых для поддержания выравнивания. Например, я не хочу иметь начальные нули, если сумма равна < 10, 1, если он находится между 10 и 99 и т.д.

Одним из решений было бы присвоить счету элемента строке и затем подсчитать символы. Тьфу! Есть ли лучший способ?

Изменить: я бы не подумал использовать общий логарифм (я не знал, что такое существо существовало). Итак, не очевидно - мне - но определенно просто.

4b9b3361

Ответ 1

Это должно сделать это:

int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;

Ответ 2

int length = (int)Math.Log10(Math.Abs(number)) + 1;

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

Ответ 3

Более эффективное решение, чем повторное деление, будет повторяться, если операторы с умножениями... например. (где n - число, число цифр которого требуется)

unsigned int test = 1;
unsigned int digits = 0;
while (n >= test)
{
  ++digits;
  test *= 10;
}

Если существует некоторая разумная верхняя граница для подсчета элемента (например, 32-битный диапазон беззнакового int), то еще лучший способ заключается в сравнении с членами некоторого статического массива, например

// this covers the whole range of 32-bit unsigned values
const unsigned int test[] = { 1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000, 1000000000 };

unsigned int digits = 10;
while(n < test[digits]) --digits;

Ответ 4

Вы можете использовать цикл while, который, скорее всего, будет быстрее, чем логарифм, поскольку он использует только целочисленную арифметику:

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

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

Ответ 5

Если вы собираетесь вставить номер в .Net, то

num.ToString().PadLeft(10, '0') 

может делать то, что вы хотите.

Ответ 6

Я бы разместил комментарий, но мой репутационный балл не предоставит мне это различие.

Все, что я хотел отметить, состояло в том, что хотя Log (10) - очень изящное (читай: очень мало строк кода) решение, вероятно, оно больше всего относится к процессору.

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

Особенно, если вы собираетесь делать это для большого количества чисел.

Ответ 7

Так как число не имеет ведущих нулей, вы все равно конвертируете их. Я не уверен, почему вы так стараетесь избежать этого, чтобы найти длину, когда конечный результат должен быть строкой в ​​любом случае.

Ответ 8

Одно из решений обеспечивается логарифмом базы 10, бит-переполнение.

Ответ 9

Вы можете прокручивать и удалять на 10, подсчитывать количество циклов, которые вы выполняете,

int num = 423;
int minimum = 1;
while (num > 10) {
    num = num/10;
    minimum++;
}

Ответ 10

Хорошо, я не могу сопротивляться: используйте /=:

#include <stdio.h>

int
main(){
        int num = 423;
        int count = 1;
        while( num /= 10)
                count ++;
        printf("Count: %d\n", count);
        return 0;
}
534 $ gcc count.c && ./a.out
Count: 3
535 $