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

StackOverflow https://stackoverflow.com/questions/554521

  •  23-08-2019
  •  | 
  •  

Вопрос

Боюсь, на этот вопрос есть простой и очевидный ответ.Мне нужно определить, сколько цифр имеет количество элементов, чтобы я мог дополнить каждый номер элемента минимум количество ведущих нулей, необходимое для поддержания выравнивания.Например, мне не нужны ведущие нули, если сумма < 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-битный диапазон беззнакового целого числа), тогда еще лучший способ — сравнить с членами некоторого статического массива, например.

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

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

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

может делать то, что хочешь.

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

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

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

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

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

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

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

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

Одним из решений является логарифм по основанию 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 $ 
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top