Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Сколько цифр в числе


Автор: turtles 17.8.2011, 05:53
Здравствуйте! У меня вот такой вопрос, по заданию Натуральное положительное число записано в переменную n.
 Определить и вывести на экран, сколько цифр в числе n.
 В переменную записал число и вывел результат.
 А теперь немогу понять как можно подсчитать сколько цифр в числе. как это можно подсчитать?
Код

public class MATH {
    public static void  main(String args[]){
       final double a = 33;
        System.out.println(a);
    }
}

Автор: rodnover 17.8.2011, 06:30
Может типа такого:
Код

int n;
int ln = n.ToString().length();

Автор: dobrolub 17.8.2011, 06:32
Натуральное число - целое число. А количество цифр равно количеству разрядов. А количество разрядов это число делений на 10, до тех пор пока результат деления не будет равен 0...

Код

public class T {
    public static void main(String []args) {
        int x = Integer.parseInt(args[0]);
        int n = 1;
        while ((x = x/10) > 0)
            n++;
        System.out.println(n);
    }
}

Автор: LSD 17.8.2011, 10:50
Цитата(dobrolub @  17.8.2011,  07:32 Найти цитируемый пост)
Натуральное число - целое число. А количество цифр равно количеству разрядов. А количество разрядов это число делений на 10, до тех пор пока результат деления не будет равен 0...

Идея верная, но цикл тут не нужен smile 
Код

1 + (int) Math.log10(Math.abs(n))


Добавлено через 2 минуты и 4 секунды
Ну и не забываем про Integer.MIN_VALUE конечно smile

Автор: priam220 22.8.2011, 19:04
а чем вам предлажуха rodnover'a не понравилась? А если число будет задано не в 10-й системе?..

Автор: rodnover 22.8.2011, 20:55
Просто, коротко, но неоптимально. smile

С логарифмом - самая лучшая идея.

Автор: dobrolub 22.8.2011, 23:20
думаю, что ожидаемое решение - моё  smile 
Это ведь вопрос из теста, правда?

Автор: danco0x53 23.8.2011, 15:05
> Dobrolub: мне кажется, более симпатичным был бы вариант  for(n=1; x>0; x /= 10);  И еще Вы забыли Math.abs
> LSD - а еще не забудем про n=0
  К тому же - вы абсолютно точно уверены, что ВСЕ степени десятки после взятия десятичного логарифма не вернут n,999999999999...? Javadoc говорит: 
Цитата
 The computed result must be within 1 ulp of the exact result. 


IMHO, rednover - просто, коротко, понятно дурвсем - и без необходимости что-то помнить.

Автор: LSD 23.8.2011, 15:50
Цитата(danco0x53 @  23.8.2011,  16:05 Найти цитируемый пост)
LSD - а еще не забудем про n=0

Натуральные числа не включают 0 smile 


Цитата(danco0x53 @  23.8.2011,  16:05 Найти цитируемый пост)
К тому же - вы абсолютно точно уверены, что ВСЕ степени десятки после взятия десятичного логарифма не вернут n,999999999999...?

Для int - уверен smile 



Кстати, в оригинале фигуриует double, так что без изменений будет работать только логарифм smile

Автор: priam220 23.8.2011, 17:27
Цитата(LSD @  23.8.2011,  15:50 Найти цитируемый пост)
Кстати, в оригинале фигуриует double, так что без изменений будет работать только логарифм


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

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

Интересно, насколько ресурсоемко вычисление логарифма? По сути это умножение с проверкой. 
Конвертация в строку, наверное медленнее, меня беспокоит метод getChars в первую очередь.

кста, сами джависты вычисляют количество символов в int весьма орригинально и без логарифмов  (Integer.class) smile :
Код

    final static int [] sizeTable = { 9, 99, 999, 9999, 99999, 999999, 9999999,
                                      99999999, 999999999, Integer.MAX_VALUE };

    // Requires positive x
    static int stringSize(int x) {
        for (int i=0; ; i++)
            if (x <= sizeTable[i])
                return i+1;
    }

Автор: LSD 23.8.2011, 18:50
Цитата(priam220 @  23.8.2011,  18:27 Найти цитируемый пост)
Интересно, насколько ресурсоемко вычисление логарифма?

Одна команда smile 

Автор: priam220 23.8.2011, 19:34
LSD,  почему тогда в core не испльзовали логарифмические команды? Я о куске с массивом девяток...
Не догадались?  smile 

Автор: LSD 24.8.2011, 10:05
Цитата(priam220 @  23.8.2011,  20:34 Найти цитируемый пост)
LSD,  почему тогда в core не испльзовали логарифмические команды? Я о куске с массивом девяток...
Не догадались?

Одна команда это в x87, а в Java это цельный вызов native функции со своим немаленьким оверхедом. Не думаю что JIT настолько интеллектуален (по крайней мере во времена написания этого кода), чтобы с оптимизировать это в одно команду.

Автор: rodnover 24.8.2011, 10:19
Почему-то мне кажется, что для такого действия достаточно интеллектуален.

С массивом супер просто решение!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)