Ответ 1
Это должно сделать это:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
Я боюсь там простого и очевидного ответа на этот вопрос. Мне нужно определить, сколько цифр содержит количество элементов, так что я могу разместить каждый номер позиции с минимальным количеством начальных нулей, необходимых для поддержания выравнивания. Например, я не хочу иметь начальные нули, если сумма равна < 10, 1, если он находится между 10 и 99 и т.д.
Одним из решений было бы присвоить счету элемента строке и затем подсчитать символы. Тьфу! Есть ли лучший способ?
Изменить: я бы не подумал использовать общий логарифм (я не знал, что такое существо существовало). Итак, не очевидно - мне - но определенно просто.
Это должно сделать это:
int length = (number ==0) ? 1 : (int)Math.log10(number) + 1;
int length = (int)Math.Log10(Math.Abs(number)) + 1;
Возможно, вам придется учитывать отрицательный знак.
Более эффективное решение, чем повторное деление, будет повторяться, если операторы с умножениями... например. (где 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;
Вы можете использовать цикл while, который, скорее всего, будет быстрее, чем логарифм, поскольку он использует только целочисленную арифметику:
int len = 0;
while (n > 0) {
len++;
n /= 10;
}
Я оставляю это как упражнение для чтения, чтобы настроить этот алгоритм для обработки нулевого и отрицательного чисел.
Если вы собираетесь вставить номер в .Net, то
num.ToString().PadLeft(10, '0')
может делать то, что вы хотите.
Я бы разместил комментарий, но мой репутационный балл не предоставит мне это различие.
Все, что я хотел отметить, состояло в том, что хотя Log (10) - очень изящное (читай: очень мало строк кода) решение, вероятно, оно больше всего относится к процессору.
Я думаю, что ответ jherico, вероятно, является наиболее эффективным решением и поэтому должен быть вознагражден как таковой.
Особенно, если вы собираетесь делать это для большого количества чисел.
Так как число не имеет ведущих нулей, вы все равно конвертируете их. Я не уверен, почему вы так стараетесь избежать этого, чтобы найти длину, когда конечный результат должен быть строкой в любом случае.
Одно из решений обеспечивается логарифмом базы 10, бит-переполнение.
Вы можете прокручивать и удалять на 10, подсчитывать количество циклов, которые вы выполняете,
int num = 423;
int minimum = 1;
while (num > 10) {
num = num/10;
minimum++;
}
Хорошо, я не могу сопротивляться: используйте /=
:
#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 $