Есть число n типа BigInteger. Необходимо определить количество цифр в этом числе.
Некрасивый способ
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++;
}
Вот еще вариант для чисел от 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 за конструктивные комментарии насчет точности метода
while(n!=0) {
n=n/10;
i++
}
System.out.print(i);
в цикле делишь на 10 и увеличиваешь счётчик пока число не превратится в 0
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Перевод документов на английский язык: Важность и ключевые аспекты
Имеются блоки для вычисления переменных BooleanКаждый этап вычисления сложный и его нельзя выразить 1 строчкой и желательно пропускать вычисления,...
Перебирается массив объектов по наличию в них искомой пользователем строкиПри попытке в foreach-цикле перебрать все элементы массива, приложение...
Создал необходимые классы-сущности, аннотации, подключение, всё работаетХочу добавить в "подключаемое" поле, тип которого MainCountryEntity, значение...