Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Взятие цифры в заданном разряде, BigInteger'а 
:(
    Опции темы
Bikutoru
Дата 9.4.2006, 12:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



Здраствуйте. У меня возникла необходимость выделения цифр в отдельных разрядах при работе с 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'ом?



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
powerOn
Дата 9.4.2006, 14:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



Цитата

и всё-таки вопрос остался - нет ли какого-нибудь способа "вытащить" значение в конкретном десятичном разряде числа, представленного 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

Это сообщение отредактировал(а) MoonCat - 9.4.2006, 14:39


--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Bikutoru
Дата 10.4.2006, 09:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



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

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

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



--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
LSD
Дата 10.4.2006, 11:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Bikutoru
Дата 10.4.2006, 12:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



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

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


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
powerOn
Дата 10.4.2006, 12:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


software saboteur
****


Профиль
Группа: Участник
Сообщений: 4367
Регистрация: 7.10.2005

Репутация: 47
Всего: 159



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

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


Код

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


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




--------------------
user posted image нет времени думать - нужно писать КОД!

PM MAIL   Вверх
Bikutoru
Дата 10.4.2006, 13:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Увлекающийся
**


Профиль
Группа: Участник
Сообщений: 522
Регистрация: 24.5.2005
Где: Москва

Репутация: нет
Всего: 22



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

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

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

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

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

Это сообщение отредактировал(а) Bikutoru - 10.4.2006, 13:48


--------------------
Человек, словно в зеркале мир — многолик, 
Он ничтожен — и он же безмерно велик!
Омар Хайям
PM   Вверх
LSD
Дата 10.4.2006, 14:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

Репутация: 210
Всего: 538



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

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


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0547 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.