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


Автор: Bikutoru 9.4.2006, 12:31
Здраствуйте. У меня возникла необходимость выделения цифр в отдельных разрядах при работе с BigInteger. Метода, позволяющего делать этого я не нашел и выкрутился следующим образом:
Код

import java.math.BigInteger;

public class BigIntegerExtractor {
    private int[] _positions;
    
    public BigIntegerExtractor(int[] positions) {
        if ((positions == null) || (positions.length == 0)) {
            throw new IllegalArgumentException();
        }
        
        _positions = positions;
    }
    
    public BigInteger getValue(BigInteger value) {
        StringBuffer sb    = new StringBuffer();
        char[] numberChars = value.toString().toCharArray();
        for (int k = 0; k < _positions.length; ++k) {
            char digit = (_positions[k] < numberChars.length) ? 
                    numberChars[_positions[k]] : '0';
            sb.append(digit);
        }
        
        return new BigInteger(sb.toString());
    }
}


и всё-таки вопрос остался - нет ли какого-нибудь способа "вытащить" значение в конкретном десятичном разряде числа, представленного BigInteger'ом?

Автор: powerOn 9.4.2006, 14:38
Цитата

и всё-таки вопрос остался - нет ли какого-нибудь способа "вытащить" значение в конкретном десятичном разряде числа, представленного BigInteger'ом?


Т.к числа целые, то данную задачу еще можно решить математически, с испльзованием деления и взятия отстатка от деления.

вот так можно разложить число на разряды. smile

Код

int i = 123456789;
        int  d = 1;
        int razr = 9;
        int [] array = new int [razr];
        
// разложим число на разряды
        for(int j = 0; j < razr; j++) {
            System.out.println("" + ( i % 10));
            array[razr - j - 1] = i % 10;
            i /= 10;
        }
// просто вывод результата на экран.
        for(int j = 0; j < razr; j++) {
            System.out.print("" + ( array[j] ) );
        }


Это будет работать быстрее чем твой код.... А если еще и доработать........ smile

Автор: Bikutoru 10.4.2006, 09:32
Цитата(MoonCat @ 9.4.2006, 15:38 Найти цитируемый пост)
Т.к числа целые, то данную задачу еще можно решить математически, с испльзованием деления и взятия отстатка от деления.

Можно, но вопрос будет ли это проще, чем мой вариант. Моя задача заключается в создании генератора псевдослучайных чисел. Принцип его работы заключается в том, что берутся несколько больших целых чисел, над ними выполняются какие-то арифметические операции, а из результата этих операций выбираются значения в каких-то заранее определенных разрядов, из которых и формируется псевдослучайное число. Ну а после этого, исходные числа заменяются по какому-то закону.

Так вот, в рамках данной задачи мне может потребоваться лишь часть разрядов большого числа (например 10 из 100), поэтому стоит ли использовать деление на 10 и взятие остатка - вопрос интересный...

Автор: LSD 10.4.2006, 11:20
А чем не устраивают стандартные генераторы случайных чисел? И зачем именно десятичные разряды использовать?

Автор: Bikutoru 10.4.2006, 12:25
Цитата(LSD @ 10.4.2006, 12:20 Найти цитируемый пост)
А чем не устраивают стандартные генераторы случайных чисел? И зачем именно десятичные разряды использовать?

Тем, что это учебная задача в рамках курса со страшным названием. И задача стоит такая:
"разработать генератор псевдослучайных чисел, дающий равномерное распределение на участке [0,1) в рамках описанной ранее идеи (читай, подобрать начальные числа, операции над ними, правила выбора разрядов для псевдослучайной величины и правила замены исходных чисел) и написать программу, которая построит гистограмму распределения.

Автор: powerOn 10.4.2006, 12:37
Сорри за оффтоп.. А как название курса звучит? Просто у меня типа такого же задания по Курсу Информационной Безопасноти.
Добавлено @ 12:48
Цитата

Так вот, в рамках данной задачи мне может потребоваться лишь часть разрядов большого числа (например 10 из 100), поэтому стоит ли использовать деление на 10 и взятие остатка - вопрос интересный...


Код

char[] numberChars = value.toString().toCharArray();


А ты думаешь что при переводе числа в строку не используется деление? Имхо очень даже используется. А это строкой ты перевод делаешь всего числа, т.е. каждый разряд выделяется. Не думаю, что сделав лишних операций ты быстрее придешь финишу... В прочем тебе виднее...


Автор: Bikutoru 10.4.2006, 13:48
Цитата(MoonCat @ 10.4.2006, 13:37 Найти цитируемый пост)
Сорри за оффтоп.. А как название курса звучит? Просто у меня типа такого же задания по Курсу Информационной Безопасноти.

"Компьютерные технологии в науке и образовании"

Цитата(MoonCat @ 10.4.2006, 13:37 Найти цитируемый пост)
А ты думаешь что при переводе числа в строку не используется деление?

ИМХО, при переводе BigInteger'a в строку? Не уверен, но и говорить, чтоэтого не происходит не буду.
На самом деле, я этот вопрос задал из-за возникшего ощущения "А не дурак ли я?", но судя по тому, что простейшего ответа "в одну строку" я не получил, получается что это была ложная тревога...
А производительность моего кода меня вполне устраивает, а заниматься оптимизацией ради оптимизации никакого желания нет.

Но все равно спасибо за ответ.

Автор: LSD 10.4.2006, 14:24
Цитата(MoonCat @ 10.4.2006, 13:37 Найти цитируемый пост)
А ты думаешь что при переводе числа в строку не используется деление? Имхо очень даже используется. А это строкой ты перевод делаешь всего числа, т.е. каждый разряд выделяется. Не думаю, что сделав лишних операций ты быстрее придешь финишу... В прочем тебе виднее...

Ты забываешь об одной вещи, это не int, а BigInteger. И операция деления для него не менее трудоемка, чем перевод в строку.
Так что ИМХО способ вполне нормальный.

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