Адресация элементов в ряде чисел

Модератор: Модераторы разделов

Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Адресация элементов в ряде чисел

Сообщение newsrc »

Здравствуйте.

Допустим есть целочисленная переменная, она хранит только ряд цифр.

Есть ли такой способ (формула, метод) чтобы в один цифровой ряд можно было записать элементы (числа), т. е.
23 - это первый элемент, 45 - это второй элемент, 3 - это третий, 4563 - это четвертый (разрядность элементов разная).
Получаем ряд 234534563
Как, обращаясь к этому ряду с желанием найти второй элемент, получить 45; обращаясь к первому элементу получить 23 и т. д.

Привязка к языку программирования не нужна, нужен сам способ. Возможно есть что-то из математики.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
whirlwind
Сообщения: 67

Re: Адресация элементов в ряде чисел

Сообщение whirlwind »

похоже на работу генератора псевдослучайных чисел. Этому посвящено много чего в прикладной теории цифровых автоматов, но делать генератор, способный породить заданный ряд чисел вроде так и не научились. Иначе, архиваторы были бы гораздо эффективнее ;)
Добро всегда побеждает зло. Мы победили, значит мы - добро.
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Адресация элементов в ряде чисел

Сообщение RasenHerz »

newsrc писал(а):
14.08.2009 17:07
Есть ли такой способ (формула, метод) чтобы в один цифровой ряд можно было записать элементы (числа), т. е.
23 - это первый элемент, 45 - это второй элемент, 3 - это третий, 4563 - это четвертый (разрядность элементов разная).
Получаем ряд 234534563

бинарные деревья, упорядоченные списки - вариантов масса, но понадобится информация о разряде каждого элемента (чтобы из 23, 467 и 52 получить 2346752, надо выполнить (23*(10^3)+467)*(10^2)+52, т.е. необходимо знать количество разрядов каждого следующего элемента)
newsrc писал(а):
14.08.2009 17:07
Как, обращаясь к этому ряду с желанием найти второй элемент, получить 45; обращаясь к первому элементу получить 23 и т. д.

пока у чисел разная разрядность - никак, т.к. понадобится дополнительная информация о разрядности всех n-1 элементов, которые находятся перед n-ым элементом.
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Адресация элементов в ряде чисел

Сообщение Crazy »

Массив целых чисел. Элемент массива ограничен в каких-нибудь пределах [min_int, max_int].
Нужно знать фактическое количество элементов, а для математических операций можно использовать поразрядное сложение, вычитание и т.д.

Desipere in loco
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Адресация элементов в ряде чисел

Сообщение newsrc »

RasenHerz писал(а):
15.08.2009 03:44
бинарные деревья, упорядоченные списки - вариантов масса, но понадобится информация о разряде каждого элемента (чтобы из 23, 467 и 52 получить 2346752, надо выполнить (23*(10^3)+467)*(10^2)+52, т.е. необходимо знать количество разрядов каждого следующего элемента)

Можно пойти от обратного. Есть элементы разной разрядности и их нужно записать в один ряд, что бы потом можно было прочитать обратно, обращаясь к нужному элементу. Ряд не обязательно должен иметь вид конкатенированных элементов.

А если установить разрядность определенную?
Например: 00045, 00006, 00456.
Связав в ряд, получим: 000450000600456
Таким образом разрядность каждого элемента 5. Как обратиться ко второму элементу (00006)?
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Адресация элементов в ряде чисел

Сообщение Женя Подсыпальников »

:)

Код: Выделить всё

bool bResult = false;
int iElement =  0;

int iRow = 000450000600456; // space enough ?
int iIndex = 2; // looking for the second element (00006, 1-based)
int iLen = (iRow) ? 1 : 0; // count of the elements

int iTemp = iRow;
while (iTemp /= int(pow(10, 5))) { // 5 = digits per element
  iLen++;
}

if (iIndex <= iLen)  {
  iElement = iRow / int(pow(pow(10, 5), (iLen - iIndex)));
  iElement %= int(pow(10, 5));
  bResult = true;
}

return bResult;
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
LuckyStr
Сообщения: 159
ОС: Fedora

Re: Адресация элементов в ряде чисел

Сообщение LuckyStr »

интерполируй n-ым многочленом:
f(x)=an*x^n+a(n-1)*x^(n-1)+a(n-2)*x^(n-2)+...+a1*x+a0, решая систему
x=1 y=23
x=2 y=45
x=3 y=3
итд
а затем обращай f(2)=45, f(3)=3 итд
многочлен легче всего получить решая систему через матрицы, в маткаде.
затем в процессе обращения при больших числах возможно потребуются достаточные вычислительные ресурсы.
Это наш химический дом для печальных жителей Земли!
Спасибо сказали:
alexf
Сообщения: 112

Re: Адресация элементов в ряде чисел

Сообщение alexf »

Если разрядность чисел может быть большая, то экономичнее всего тэги использовать, только краткие, одноцифровые.

Ну например поставить цифру 0 за тег разрядности. Т.е. если встречаем в последовательности 0, то следующая цифра будет означать количество разрядов следующего числа.

А настоящий 0 тогда кодировать двойным нулём: 00.

Ваш пример тогда записывается как:

02230245013044563

Соответственно при поиске просто отсчитываем количество элементов (каждый из них начинается с 0Х, где Х - не 0) и читаем нужный элемент (разрядность есть).


Женя Подсыпальников писал(а):
15.08.2009 23:54
int iRow = 000450000600456; // space enough ?


У вас int - 64 бита? Тогда этот конкретный пример пойдёт... А если в цепочке больше элементов? )

Функция pow - медленная.

В данном случае по любому надо работать как со строкам, а не как с числами.
Спасибо сказали:
Аватара пользователя
Женя Подсыпальников
Сообщения: 482

Re: Адресация элементов в ряде чисел

Сообщение Женя Подсыпальников »

alexf писал(а):
16.08.2009 20:17
У вас int - 64 бита? Тогда этот конкретный пример пойдёт... А если в цепочке больше элементов? )

Функция pow - медленная.

В данном случае по любому надо работать как со строкам, а не как с числами.


В разряд "по-любому" -
я бы отнёс решение от Крэзи с массивом целых -
как самое простое и быстрое... :)

...но автор - не "клюнул" на него, возможно, намекая о важности единственного целого,
и тогда я попытался ответить на его последний вопрос о разборе этого целого :)

Моё "решение" - я бы не стал использовать сам,
тут отдаю честь Вашей правоте, но да дело - не во мне... :)
Пойдём на рыбалку !
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Адресация элементов в ряде чисел

Сообщение Denjs »

newsrc писал(а):
14.08.2009 17:07
Здравствуйте.

Допустим есть целочисленная переменная, она хранит только ряд цифр.

Есть ли такой способ (формула, метод) чтобы в один цифровой ряд можно было записать элементы (числа), т. е.
23 - это первый элемент, 45 - это второй элемент, 3 - это третий, 4563 - это четвертый (разрядность элементов разная).
Получаем ряд 234534563
Как, обращаясь к этому ряду с желанием найти второй элемент, получить 45; обращаясь к первому элементу получить 23 и т. д.

Привязка к языку программирования не нужна, нужен сам способ. Возможно есть что-то из математики.

если вы желаете получить ряд "234534563" - состоящий из последовательности 23+45+3+4563 - то никак.
Если же вам все равно какой ряд получать - то можно придумать много разных способов. Например 0023004500034563 <= 0023+0045+0003+4563
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Адресация элементов в ряде чисел

Сообщение newsrc »

alexf писал(а):
16.08.2009 20:17
В данном случае по любому надо работать как со строкам, а не как с числами.

Нет, хотелось бы работать не со строками, а именно с целочисленными.

Спасибо, всем. Идеи есть разные, будем думать.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
alexf
Сообщения: 112

Re: Адресация элементов в ряде чисел

Сообщение alexf »

newsrc писал(а):
17.08.2009 14:02
Нет, хотелось бы работать не со строками, а именно с целочисленными.

Так в таком случае получается что ваша последовательность может содержать максимум 3-4 элемента для целочисленных типа int. Ну или побольше на 64 битных системах, но всё равно несколько штук. Странная задача выходит - может я что-то не так понял?
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Адресация элементов в ряде чисел

Сообщение RasenHerz »

alexf писал(а):
17.08.2009 23:46
newsrc писал(а):
17.08.2009 14:02
Нет, хотелось бы работать не со строками, а именно с целочисленными.

Так в таком случае получается что ваша последовательность может содержать максимум 3-4 элемента для целочисленных типа int. Ну или побольше на 64 битных системах, но всё равно несколько штук. Странная задача выходит - может я что-то не так понял?

ну есть библиотеки для работы с большими целыми числами (к примеру, FLINT/C).
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Адресация элементов в ряде чисел

Сообщение newsrc »

alexf писал(а):
17.08.2009 23:46
newsrc писал(а):
17.08.2009 14:02
Нет, хотелось бы работать не со строками, а именно с целочисленными.

Так в таком случае получается что ваша последовательность может содержать максимум 3-4 элемента для целочисленных типа int. Ну или побольше на 64 битных системах, но всё равно несколько штук. Странная задача выходит - может я что-то не так понял?


Да, действительно. Даже если использовать тип double от 1.7E-308 до 1.7E+308 на много его не хватит.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
alexf
Сообщения: 112

Re: Адресация элементов в ряде чисел

Сообщение alexf »

RasenHerz писал(а):
18.08.2009 08:57
ну есть библиотеки для работы с большими целыми числами (к примеру, FLINT/C).

Интересно как она работает (я эту не смотрел раньше), через строки или нет. Я разные видел.


newsrc писал(а):
18.08.2009 10:08
Да, действительно. Даже если использовать тип double от 1.7E-308 до 1.7E+308 на много его не хватит.

Значащих разрядов у double будет поменьше чем у int64...
Спасибо сказали:
Аватара пользователя
Crazy
Сообщения: 862
Статус: Адепт Дзен.
ОС: Mint, Win7.

Re: Адресация элементов в ряде чисел

Сообщение Crazy »

alexf писал(а):
18.08.2009 16:49
Значащих разрядов у double будет поменьше чем у int64...

Это уже конкретный язык(а то и компилятор). Все равно невозможно то, что просят в первом посте.
Интересно для чего подобное нужно?

Desipere in loco
Спасибо сказали:
Аватара пользователя
RasenHerz
Сообщения: 1341
ОС: Arch Linux amd64

Re: Адресация элементов в ряде чисел

Сообщение RasenHerz »

alexf писал(а):
18.08.2009 16:49
Интересно как она работает (я эту не смотрел раньше), через строки или нет. Я разные видел.

Напрямую с массивом байт (т.е. не через строки). Я работал с ней когда читал книгу Вельшенбаха по криптографии - ничего плохого сказать не могу.
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Адресация элементов в ряде чисел

Сообщение newsrc »

Crazy писал(а):
18.08.2009 18:00
Это уже конкретный язык(а то и компилятор). Все равно невозможно то, что просят в первом посте.
Интересно для чего подобное нужно?

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

Re: Адресация элементов в ряде чисел

Сообщение alexf »

Нууу с некоторыми поправками...

1. Если вы как уже сказали ограничите максимальную разрядность элементов (не большую надеюсь, что бы много лишних нулей не было)
2. Согласитесь использовать не напрямую переменную типа int, а некую сущность ведущую себя снаружи как int.

То тогда используя библиотеку типа FLINT/C и код по типу предложенного Женя Подсыпальников (конечно слегка оптимизировав его по скорости), вы получите буквательно требуемый результат.

Но вообще сама задача выглядит подозрительно. )))
Спасибо сказали:
Аватара пользователя
newsrc
Сообщения: 314
ОС: Slackware

Re: Адресация элементов в ряде чисел

Сообщение newsrc »

Да, задача подозрительная :crazy:

Всем спасибо. Если сделаю в том варианте, в котором хотел -- выложу.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
Спасибо сказали:
Аватара пользователя
begin2009
Сообщения: 349
Статус: Ламер со стажем
ОС: без глюков

Re: Адресация элементов в ряде чисел

Сообщение begin2009 »

Если проблема не решена, то попробую высказать свое мнение. Здесь вряд ли можно использовать обычные типы переменной. Я бы сделал так (на паскале):
Объявил пользовательский тип.

Код: Выделить всё

type Tpara = record
            number: integer;
            size: integer;
            end;
     Tinfo = array [1..1000] of Tpara;
     TLongLine = object
       info: Tinfo;
       place: INT64;
       last: integer;
       procedure init;
       procedure add(n:integer);
       procedure take(n:integer;var i:integer);
     end;

В записи Tpara number будет хранить номер элемента, а size - размер (количество цифр в числе). Tinfo массив, хранящий информацию о всех элементах. Я указал, что элементов 1000, но Вы можете ставить сколько надо TLongLine объект с нашей переменной, информацией о всех элементах и методах работы. place и будет искомое число, состоящее из последовательно записанных элементов. К стати, я не понимаю, почему не сделать эту переменную строковой. Ограничение на длину отменяются. А если есть желание производить с числом математические операции, то можно написать процедуры под сложение, умножение и т.д. А вот хранить в строковом виде. last номер последнегшо элемента.
Процедуры:
procedure init; инициализация
procedure add(n:integer); добавление нового числа
procedure take(n:integer;var i:integer); получение n-го числа i

Процедуры написать что-то вроде:

Код: Выделить всё

procedure TLongLine.init;
begin
 place:=0;
 last:=0;
end;

procedure TLongLine.add(n:integer);
var tmp: string;
    len1,len2:integer;
begin
 if place=0 then tmp:=''
                      else tmp:=IntToStr(place);
 len1:=length(tmp);
 len2:=length(IntToStr(n));
 tmp:=tmp+IntToStr(n);
 place:=StrToInt(tmp);
 last:=last+1;
 info[last].number:=len1;
 info[last].size:=len2;
 place:=StrToInt(tmp);
end;

procedure TLongLine.take(n: integer; var i:integer);
var tmp: string;
begin
 tmp:=IntToStr(place);
 tmp:=copy(tmp,info[last].size,n);
 i:=StrToInt(tmp);
end;


Извините, не проверял на рабочесть. Но идея, я думаю, ясна. Если я правильно понял техническое задание.
Пессимист видит темный туннель, оптимист видит свет в конце туннеля, реалист видит свет, туннель и поезд.
И только машинист видит этих трех идиотов, сидящих на рельсах.
Спасибо сказали: