Адресация элементов в ряде чисел
Модератор: Модераторы разделов
-
newsrc
- Сообщения: 314
- ОС: Slackware
Адресация элементов в ряде чисел
Здравствуйте.
Допустим есть целочисленная переменная, она хранит только ряд цифр.
Есть ли такой способ (формула, метод) чтобы в один цифровой ряд можно было записать элементы (числа), т. е.
23 - это первый элемент, 45 - это второй элемент, 3 - это третий, 4563 - это четвертый (разрядность элементов разная).
Получаем ряд 234534563
Как, обращаясь к этому ряду с желанием найти второй элемент, получить 45; обращаясь к первому элементу получить 23 и т. д.
Привязка к языку программирования не нужна, нужен сам способ. Возможно есть что-то из математики.
Допустим есть целочисленная переменная, она хранит только ряд цифр.
Есть ли такой способ (формула, метод) чтобы в один цифровой ряд можно было записать элементы (числа), т. е.
23 - это первый элемент, 45 - это второй элемент, 3 - это третий, 4563 - это четвертый (разрядность элементов разная).
Получаем ряд 234534563
Как, обращаясь к этому ряду с желанием найти второй элемент, получить 45; обращаясь к первому элементу получить 23 и т. д.
Привязка к языку программирования не нужна, нужен сам способ. Возможно есть что-то из математики.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
-
whirlwind
- Сообщения: 67
Re: Адресация элементов в ряде чисел
похоже на работу генератора псевдослучайных чисел. Этому посвящено много чего в прикладной теории цифровых автоматов, но делать генератор, способный породить заданный ряд чисел вроде так и не научились. Иначе, архиваторы были бы гораздо эффективнее 
Добро всегда побеждает зло. Мы победили, значит мы - добро.
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Адресация элементов в ряде чисел
бинарные деревья, упорядоченные списки - вариантов масса, но понадобится информация о разряде каждого элемента (чтобы из 23, 467 и 52 получить 2346752, надо выполнить (23*(10^3)+467)*(10^2)+52, т.е. необходимо знать количество разрядов каждого следующего элемента)
пока у чисел разная разрядность - никак, т.к. понадобится дополнительная информация о разрядности всех n-1 элементов, которые находятся перед n-ым элементом.
-
Crazy
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
Re: Адресация элементов в ряде чисел
Массив целых чисел. Элемент массива ограничен в каких-нибудь пределах [min_int, max_int].
Нужно знать фактическое количество элементов, а для математических операций можно использовать поразрядное сложение, вычитание и т.д.
Нужно знать фактическое количество элементов, а для математических операций можно использовать поразрядное сложение, вычитание и т.д.
Desipere in loco
-
newsrc
- Сообщения: 314
- ОС: Slackware
Re: Адресация элементов в ряде чисел
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: Адресация элементов в ряде чисел
интерполируй 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 итд
многочлен легче всего получить решая систему через матрицы, в маткаде.
затем в процессе обращения при больших числах возможно потребуются достаточные вычислительные ресурсы.
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: Адресация элементов в ряде чисел
Если разрядность чисел может быть большая, то экономичнее всего тэги использовать, только краткие, одноцифровые.
Ну например поставить цифру 0 за тег разрядности. Т.е. если встречаем в последовательности 0, то следующая цифра будет означать количество разрядов следующего числа.
А настоящий 0 тогда кодировать двойным нулём: 00.
Ваш пример тогда записывается как:
02230245013044563
Соответственно при поиске просто отсчитываем количество элементов (каждый из них начинается с 0Х, где Х - не 0) и читаем нужный элемент (разрядность есть).
У вас int - 64 бита? Тогда этот конкретный пример пойдёт... А если в цепочке больше элементов? )
Функция pow - медленная.
В данном случае по любому надо работать как со строкам, а не как с числами.
Ну например поставить цифру 0 за тег разрядности. Т.е. если встречаем в последовательности 0, то следующая цифра будет означать количество разрядов следующего числа.
А настоящий 0 тогда кодировать двойным нулём: 00.
Ваш пример тогда записывается как:
02230245013044563
Соответственно при поиске просто отсчитываем количество элементов (каждый из них начинается с 0Х, где Х - не 0) и читаем нужный элемент (разрядность есть).
У вас int - 64 бита? Тогда этот конкретный пример пойдёт... А если в цепочке больше элементов? )
Функция pow - медленная.
В данном случае по любому надо работать как со строкам, а не как с числами.
-
Женя Подсыпальников
- Сообщения: 482
Re: Адресация элементов в ряде чисел
В разряд "по-любому" -
я бы отнёс решение от Крэзи с массивом целых -
как самое простое и быстрое...
...но автор - не "клюнул" на него, возможно, намекая о важности единственного целого,
и тогда я попытался ответить на его последний вопрос о разборе этого целого
Моё "решение" - я бы не стал использовать сам,
тут отдаю честь Вашей правоте, но да дело - не во мне...
Пойдём на рыбалку !
-
Denjs
- Сообщения: 1685
- ОС: SuSe 10.2
Re: Адресация элементов в ряде чисел
newsrc писал(а): ↑14.08.2009 17:07Здравствуйте.
Допустим есть целочисленная переменная, она хранит только ряд цифр.
Есть ли такой способ (формула, метод) чтобы в один цифровой ряд можно было записать элементы (числа), т. е.
23 - это первый элемент, 45 - это второй элемент, 3 - это третий, 4563 - это четвертый (разрядность элементов разная).
Получаем ряд 234534563
Как, обращаясь к этому ряду с желанием найти второй элемент, получить 45; обращаясь к первому элементу получить 23 и т. д.
Привязка к языку программирования не нужна, нужен сам способ. Возможно есть что-то из математики.
если вы желаете получить ряд "234534563" - состоящий из последовательности 23+45+3+4563 - то никак.
Если же вам все равно какой ряд получать - то можно придумать много разных способов. Например 0023004500034563 <= 0023+0045+0003+4563
-
newsrc
- Сообщения: 314
- ОС: Slackware
Re: Адресация элементов в ряде чисел
Нет, хотелось бы работать не со строками, а именно с целочисленными.
Спасибо, всем. Идеи есть разные, будем думать.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
-
alexf
- Сообщения: 112
Re: Адресация элементов в ряде чисел
Так в таком случае получается что ваша последовательность может содержать максимум 3-4 элемента для целочисленных типа int. Ну или побольше на 64 битных системах, но всё равно несколько штук. Странная задача выходит - может я что-то не так понял?
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Адресация элементов в ряде чисел
ну есть библиотеки для работы с большими целыми числами (к примеру, FLINT/C).
-
newsrc
- Сообщения: 314
- ОС: Slackware
Re: Адресация элементов в ряде чисел
Да, действительно. Даже если использовать тип double от 1.7E-308 до 1.7E+308 на много его не хватит.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
-
alexf
- Сообщения: 112
Re: Адресация элементов в ряде чисел
Интересно как она работает (я эту не смотрел раньше), через строки или нет. Я разные видел.
Значащих разрядов у double будет поменьше чем у int64...
-
Crazy
- Сообщения: 862
- Статус: Адепт Дзен.
- ОС: Mint, Win7.
Re: Адресация элементов в ряде чисел
Это уже конкретный язык(а то и компилятор). Все равно невозможно то, что просят в первом посте.
Интересно для чего подобное нужно?
Desipere in loco
-
RasenHerz
- Сообщения: 1341
- ОС: Arch Linux amd64
Re: Адресация элементов в ряде чисел
Напрямую с массивом байт (т.е. не через строки). Я работал с ней когда читал книгу Вельшенбаха по криптографии - ничего плохого сказать не могу.
-
newsrc
- Сообщения: 314
- ОС: Slackware
Re: Адресация элементов в ряде чисел
Столько перебрал вариантов... Не возможно....
А задача эта искусственная и ограничения связанны с желание выполнит задачу лишь с помощью определенных функций определенного языка.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
-
alexf
- Сообщения: 112
Re: Адресация элементов в ряде чисел
Нууу с некоторыми поправками...
1. Если вы как уже сказали ограничите максимальную разрядность элементов (не большую надеюсь, что бы много лишних нулей не было)
2. Согласитесь использовать не напрямую переменную типа int, а некую сущность ведущую себя снаружи как int.
То тогда используя библиотеку типа FLINT/C и код по типу предложенного Женя Подсыпальников (конечно слегка оптимизировав его по скорости), вы получите буквательно требуемый результат.
Но вообще сама задача выглядит подозрительно. )))
1. Если вы как уже сказали ограничите максимальную разрядность элементов (не большую надеюсь, что бы много лишних нулей не было)
2. Согласитесь использовать не напрямую переменную типа int, а некую сущность ведущую себя снаружи как int.
То тогда используя библиотеку типа FLINT/C и код по типу предложенного Женя Подсыпальников (конечно слегка оптимизировав его по скорости), вы получите буквательно требуемый результат.
Но вообще сама задача выглядит подозрительно. )))
-
newsrc
- Сообщения: 314
- ОС: Slackware
Re: Адресация элементов в ряде чисел
Да, задача подозрительная
Всем спасибо. Если сделаю в том варианте, в котором хотел -- выложу.
Всем спасибо. Если сделаю в том варианте, в котором хотел -- выложу.
Система -- это совокупность элементов и связей, дающая новые свойства, не присущие ни одному из элементов и ни одной из связей.
-
begin2009
- Сообщения: 349
- Статус: Ламер со стажем
- ОС: без глюков
Re: Адресация элементов в ряде чисел
Если проблема не решена, то попробую высказать свое мнение. Здесь вряд ли можно использовать обычные типы переменной. Я бы сделал так (на паскале):
Объявил пользовательский тип.
В записи Tpara number будет хранить номер элемента, а size - размер (количество цифр в числе). Tinfo массив, хранящий информацию о всех элементах. Я указал, что элементов 1000, но Вы можете ставить сколько надо TLongLine объект с нашей переменной, информацией о всех элементах и методах работы. place и будет искомое число, состоящее из последовательно записанных элементов. К стати, я не понимаю, почему не сделать эту переменную строковой. Ограничение на длину отменяются. А если есть желание производить с числом математические операции, то можно написать процедуры под сложение, умножение и т.д. А вот хранить в строковом виде. last номер последнегшо элемента.
Процедуры:
procedure init; инициализация
procedure add(n:integer); добавление нового числа
procedure take(n:integer;var i:integer); получение n-го числа i
Процедуры написать что-то вроде:
Извините, не проверял на рабочесть. Но идея, я думаю, ясна. Если я правильно понял техническое задание.
Объявил пользовательский тип.
Код: Выделить всё
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;Извините, не проверял на рабочесть. Но идея, я думаю, ясна. Если я правильно понял техническое задание.
Пессимист видит темный туннель, оптимист видит свет в конце туннеля, реалист видит свет, туннель и поезд.
И только машинист видит этих трех идиотов, сидящих на рельсах.
И только машинист видит этих трех идиотов, сидящих на рельсах.