Страницы

Поиск по вопросам

среда, 11 декабря 2019 г.

Как узнать первую цифру элемента массива?

#java #алгоритм


Друзья, как узнать первую цифру элемента массива? 
С последней  я разобрался, а вот с первой затруднения. 

например, дан массив a=[352, 234,745,853]

вывести 3, 2, 7 ,8
    


Ответы

Ответ 1



Вариант Владимира Мартьянова из комментариев (о преобразовании в строку и выборке символа на первой позиции) хороший. Альтернативно можно делать так: Если число равно нулю, то выводим 0, берём следующее число и снова проверяем. Когда число перестанет быть 0, переходим к пункту 2 Находим от числа десятичный логарифм Отбрасываем мантиссу (получается число, равное разрядности - 1) Возводим 10 в полученную степень Отбрасываем мантиссу (потому что Math.pow возвращает double) Делим исходное число на полученное в пункте 5 (получается первая цифра) Такой код: int a[] = {352, 2354,745,853}; for (int i : a) { if (i==0) { System.out.println(0); continue; } if ( i == Integer.MIN_VALUE ) { System.out.println(2); continue; } System.out.println(i / (int)Math.pow(10, ((int)(Math.log10(Math.abs(i)))))); } Output: 3 2 7 8 UPDATE Как подсказал @VladD, нужно отдельно рассмотреть случай с Integer.MIN_VALUE. Дело в том, что Math.abs при i < 0 возвращает -i, а для int это уже выход за пределы 2147483647. Поэтому число возвращается на свою отрицательную позицию.

Ответ 2



Еще один вариант: Проверяем, превышает ли число 10 (включительно) Если да, делим на 10 без остатка и GOTO 1. Если нет, выводим как результат. Код: int a[] = {352, 2354, 745, 853}; for (int i : a) { // если число может быть отрицательным, добавляем следующую строку. i = Math.abs(i) while (i >= 10) { i = i / 10; } System.out.println(i); } 3 2 7 8 Я надеюсь, выводить в одну строку и с рандомными запятыми (3, 2, 7 ,8) это не обязательное требование? =)

Ответ 3



Реализация по мотивам Integer.toString и компании. В принципе, тот же логарифм, но по таблице. final static int[] placements = new int[] { 0, 9, 99, 999, 9_999, 99_999, 999_999, 9_999_999, 99_999_999, 999_999_999, Integer.MAX_VALUE }; static int firstDigit( int number ) { // т.к. Math.abs( Integer.MIN_VALUE ) == Integer.MIN_VALUE // выносим в отдельную проверку if ( number == Integer.MIN_VALUE ) return 2; number = Math.abs( number ); int position = 1; while ( number > placements[position] ) { position++; } return number / (placements[position-1]+1); } public static void main(String args[]) { int a[] = {352, 2354, 745, 853}; // Ня! Стримы! System.out.println( Arrays.stream( a ).map( n -> firstDigit( n ) ) .mapToObj( Integer::toString ).collect( Collectors.joining( ", " ) ) ); }

Комментариев нет:

Отправить комментарий