Определить количество цифр в числе типа BigInteger в Java

554
05 сентября 2017, 09:21

Есть число n типа BigInteger. Необходимо определить количество цифр в этом числе.

Answer 1

Некрасивый способ

BigInteger value = new BigInteger("231");
int digits = value.toString(10).length();

По-другому некрасивый способ, но уже получше

BigInteger value = new BigInteger("231");
int digits = 0;
while (!value.equals(BigInteger.ZERO)) {
    value = value.divide(BigInteger.TEN);
    digits++;
}
Answer 2

Вот еще вариант для чисел от 1 до 1 до 99 999 999 999 999 (верхняя граница грубая, т.к. для большинства 15-значных тоже работает, но не всех) с использованием 10го логарифма:

private static int logLength(BigInteger i){
    return (int) Math.floor(Math.log10(i.doubleValue()))+1;
}

Мои грубые замеры показали, что такой вариант работает в несколько раз быстрее, чем способ через длину строки:

public static void main(String[] args) {
    long start = System.currentTimeMillis();
    BigInteger integer = BigInteger.ONE;
    //увеличиваем значения на 11 (для чистоты эксперимента - чтобы log10 не был целым) каждые 1_000_000 итераций
    BigInteger multiplier = BigInteger.valueOf(11);
    for (int i = 0; i < 14; i++) {
        for (int j=0; j<1_000_000; j++){
            logLength(integer);
        }
        integer = integer.multiply(multiplier);
    }
    long end = System.currentTimeMillis();
    System.out.println("log10: " + ((double)(end - start))/1000);
    integer = BigInteger.ONE;
    start = System.currentTimeMillis();
    for (int i = 0; i < 14; i++) {
        for (int j=0; j<1_000_000; j++){
            strLength(integer);
        }
        integer = integer.multiply(multiplier);
    }
    end = System.currentTimeMillis();
    System.out.println("strlen: " + ((double)(end - start))/1000);
}
private static int strLength(BigInteger i){
    return i.toString(10).length();
}

Результаты:

log10: 0.387
strlen: 1.768

PS:
Спасибо @default locale за конструктивные комментарии насчет точности метода

Answer 3
while(n!=0) {
n=n/10;
i++
}
System.out.print(i);

в цикле делишь на 10 и увеличиваешь счётчик пока число не превратится в 0

READ ALSO
Task boolean Java [требует правки]

Task boolean Java [требует правки]

Имеются блоки для вычисления переменных BooleanКаждый этап вычисления сложный и его нельзя выразить 1 строчкой и желательно пропускать вычисления,...

277
При переборе массива возникает java.lang.ExceptionInInitializerError

При переборе массива возникает java.lang.ExceptionInInitializerError

Перебирается массив объектов по наличию в них искомой пользователем строкиПри попытке в foreach-цикле перебрать все элементы массива, приложение...

369
Получить дату из DatePickerDialog

Получить дату из DatePickerDialog

Есть класс DialogObject наследник от DialogFragment:

271
Как добавлять в подключаемое поле при использовании Hybernate,JPA?

Как добавлять в подключаемое поле при использовании Hybernate,JPA?

Создал необходимые классы-сущности, аннотации, подключение, всё работаетХочу добавить в "подключаемое" поле, тип которого MainCountryEntity, значение...

178