Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как одном числе хранить сумму трех чисел, с обратной возможность декодирования 
:(
    Опции темы
Delphist
Дата 17.3.2008, 20:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



1. Стала такая задача, есть три числа a, b, c в сумме они дают 100, a + b + c = 100; 
Нужно суммы этих чисел представить через какую-то функцию кодирования (или другим способом) в число, чтобы 
потом по этому числу применяя функции декодирования можно было получить эти три числа, т.е. 
SomeMathFuncCode(a, b, c) = d;
SomeMathFuncDecode(d) = {a, b, c}

2. Как это же реализовать если, чисел > 3 т.е (a, b, c, d, ...) и сумма их равна не 100, а заданному числу X.

Примечание: a, b, c - могут быть дробными

Это сообщение отредактировал(а) Delphist - 17.3.2008, 20:45


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Sardar
Дата 17.3.2008, 20:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бегун
****


Профиль
Группа: Модератор
Сообщений: 6986
Регистрация: 19.4.2002
Где: Нидерланды, Groni ngen

Репутация: 1
Всего: 317



Пусть число ограничено 8 битами, тогда побитовым сдвигом влево все три числа и берём сумму (ну или OR побитовое если числа могут быть негативными). Обратно AND побитовое по маске, сдвиг обратно в право. В обычный uint(32) уложиться 4 таких числа, для других размерностей принцип тот же.

Восстановить сумму из трёх произвольных по значению и размерам числа по моему не возможно.


--------------------
 Опыт - сын ошибок трудных  © А. С. Пушкин
 Процесс написания своего велосипеда повышает профессиональный уровень программиста. © Opik
 Оценить мои качества можно тут.
PM   Вверх
Delphist
Дата 17.3.2008, 20:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(Sardar @  17.3.2008,  21:43 Найти цитируемый пост)
Пусть число ограничено 8 битами, тогда побитовым сдвигом влево все три числа и берём сумму (ну или OR побитовое если числа могут быть негативными). Обратно AND побитовое по маске, сдвиг обратно в право. В обычный uint(32) уложиться 4 таких числа, для других размерностей принцип тот же.

Мог бы этот алгоритмик как-нить программно зарисовать, а то не совсем понятно.


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
4d5a
Дата 17.3.2008, 21:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



А почему бы не так

Код


function encode(a,b,c:integer):integer;
begin
  result:=(a shl 16) or (b shl 8) or c;
end;
procedure decode(d:integer; var a,b,c:integer);
var bt:integer;
begin
  bt:=$ff;                  
  c:=d and bt; bt:= bt shl 8;
  b:=(d and bt)shr 8; bt:=bt shl 8;
  a:=(d and bt)shr 16;
end;



Цитата(Delphist @  17.3.2008,  20:14 Найти цитируемый пост)
2. Как это же реализовать если, чисел > 3 т.е (a, b, c, d, ...) и сумма их равна не 100, а заданному числу X.


Тогда надо еще доказать что при выбранном методе 'уплотнения' они влезут в это число smile 
PM MAIL   Вверх
Akina
Дата 17.3.2008, 21:12 (ссылка) |    (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Исходная задача - это типичная задача хранения избыточных данных.
Самое простое - это хранение минимально необходимых данных, которые позволяют восстановить недостающие.
Например в исходном случае, если надо хранить ровно 3 числа (a,b,c), их сумма всегда равна 100 и они всегда неотрицательны, достаточно хранить одно число N = 100*a+b. Очевидно, что этого числа достаточно, чтобы восстановить всю тройку (a=N\100; b=N%100; c=100-a-b).
Для любого другого варианта просто необходимо определить, какие данные являются избыточными, выбросить их, а из оставшихся составить выражение с однозначным соответствием.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
VICTAR
Дата 17.3.2008, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Уже ответили... Ну не зря же я старался  smile 
Код

type 
Bytes= array [0..3] of Byte;

function ToBytes(const Source: Cardinal): Bytes;
var
  i: Byte;
begin
  for i := 0 to 3 do
    Result[i] := Source shr (8 * i) and $000000FF;
end;

function ToInt(const Source: Bytes): Cardinal;
var
  i: Byte;
begin
  Result := 0;
  for i := 0 to 3 do
    Inc(Result, Source[i] shl (8 * i));
end;

PM MAIL   Вверх
sergejzr
Дата 17.3.2008, 23:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Akina, как всегда - максимус элегантус!  smile 


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Delphist
Дата 18.3.2008, 09:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(Akina @  17.3.2008,  22:12 Найти цитируемый пост)
Самое простое - это хранение минимально необходимых данных, которые позволяют восстановить недостающие.
Например в исходном случае, если надо хранить ровно 3 числа (a,b,c), их сумма всегда равна 100 и они всегда неотрицательны, достаточно хранить одно число N = 100*a+b.

Твой метод не работает, если числа дробные. А мне нужен как раз для дробных чисел

Это сообщение отредактировал(а) Delphist - 18.3.2008, 09:56


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akina
Дата 18.3.2008, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Цитата(Delphist @  18.3.2008,  10:56 Найти цитируемый пост)
метод не работает, если числа дробные. А мне нужен как раз для дробных чисел

А я не телепат. Хочешь получить решение для задачи, озвучив только треть условий? 
Впрочем, ПРИНЦИП от этого не меняется.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
ama_kid
Дата 18.3.2008, 10:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(Delphist @  18.3.2008,  09:56 Найти цитируемый пост)
А мне нужен как раз для дробных чисел
Как вариант - можно рассмотреть случай с ограничением числа знаков после запятой: к примеру у тебя есть числа 21.29, 41.35 и 37.36. В сумме они дают требуемую сотню. Тогда переводим числа из дробного вида в целый путем умножения на 100: 2129+4135+3736 = 10000. Дальше все сводится к методу, описанному Akina... 


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Delphist
Дата 18.3.2008, 10:23 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(ama_kid @  18.3.2008,  11:08 Найти цитируемый пост)
 Дальше все сводится к методу, описанному Akina...  

Неа не сводится, метод Akina работает с целыми числами (a, b, c) непревышающие 255


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
ama_kid
Дата 18.3.2008, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


АСУТП-кодер
***


Профиль
Группа: Комодератор
Сообщений: 1460
Регистрация: 5.3.2007
Где: Москва

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



Цитата(Delphist @  18.3.2008,  10:23 Найти цитируемый пост)
Неа не сводится, метод Akina работает с целыми числами (a, b, c) непревышающие 255 
Сводится, только размер хранимого числа требованием "для дробных чисел" увеличивается с байта до Integer:
N=10000*a+b = 10000*2129+4135=21294135
Восстанавливаем числа:
a = N\10000 = 2129 (затем превращаем в дробное делением на 100) = 21.29
b = N%10000 = 4135 =>41.35
c = 100.00 - a - b => 37.36
P.S. Все это рассматриваю как пример, не больше. В конечном итоге надо исходить из конкретных данных, вполне возможно ограничение числа знаков после запятой некорректно...


--------------------
самурай без меча подобен самураю с мечом, но только без меча 
PM MAIL   Вверх
Akina
Дата 18.3.2008, 13:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Цитата(Delphist @  18.3.2008,  11:23 Найти цитируемый пост)
Неа не сводится, метод Akina работает с целыми числами (a, b, c) непревышающие 255 

Позволю себе процитировать себя же
Цитата(Akina @  17.3.2008,  22:12 Найти цитируемый пост)
составить выражение с однозначным соответствием




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Delphist
Дата 18.3.2008, 20:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(Akina @  18.3.2008,  14:41 Найти цитируемый пост)
составить выражение с однозначным соответствием

Не понял


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
sergejzr
Дата 18.3.2008, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: 4
Всего: 360



Цитата(Delphist @  18.3.2008,  09:23 Найти цитируемый пост)
Неа не сводится, метод Akina работает с целыми числами (a, b, c) непревышающие 255 

Неверно, "размер" числа значения не имеет. От дробность - тоже можно избавиться (хотя информация о количестве знаков после запятой не сохраняетя)
А вот методы со сдвигами как раз ограничивают "размер" сохраняемых чисел.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
Akina
Дата 18.3.2008, 21:40 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Цитата(Delphist @  18.3.2008,  21:18 Найти цитируемый пост)
Не понял 

Да это тебя пока никто не понял. Ты до сих пор не сформулировал задачу ПОЛНОСТЬЮ. Со всеми условиями, в ти.ч. граничными. А мы, как дураки, гадаем на кофейной гуще, что же у тебя там собсно происходит и с чем именно. Я, например, до сих пор не знаю, какими могут быть эти а-бэ-цэ - только положительными или еще и нулевыми и даже отрицательными, простой они точности или двойной, или точность задана...
Неужели трудно точно поставить задачу?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Delphist
Дата 19.3.2008, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(Akina @  18.3.2008,  22:40 Найти цитируемый пост)
Неужели трудно точно поставить задачу? 

числа a, b, c могут быть дробными, функции EnCode превращает их в одно число d (целое или дробное), а функция DeCode превращает из числа d их обратно в три числа a, b, c

Вот собственно и все


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
mes
Дата 19.3.2008, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Delphist @  19.3.2008,  15:19 Найти цитируемый пост)
числа a, b, c могут быть

лучше тогда вопрос: а какими они не могут быть? 

так как вышеописанное условие не соответствует фразе
Цитата(Akina @  18.3.2008,  21:40 Найти цитируемый пост)
 Со всеми условиями, в ти.ч. граничными



Это сообщение отредактировал(а) mes - 19.3.2008, 15:48


--------------------
PM MAIL WWW   Вверх
Akina
Дата 19.3.2008, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Цитата(Delphist @  19.3.2008,  16:19 Найти цитируемый пост)
числа a, b, c могут быть дробными

Извини за грубость, но термин "дробные" надо было забыть еще в детском саду. Real? Double? или какие там у вас в Дельфах есть типы... ограничения на значения есть? какие именно?


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
4d5a
Дата 20.3.2008, 20:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Думаю из всего вышесказанного можно наконец то выпарить точную формулировку задачи:

Даны три рациональных числа (a,b,c), представленных в виде десятичной дроби. 
Каждое число принадлежит промежутку [0;100]. Максимальное количество знаков(десятичных) после запятой равно X0. Для ввода и вывода чисел используется тип double: 8 byte.
Найти функцию FY(Y1,Y2,Y3)->{Y0}, и обратную ей функцию FZ(Z0)->{Z1,Z2,Z3} которые удовлетворяют условию
FY(FZ(V))=V 
(запись "->{Z1,Z2,Z3}" означает что функция возвращает три значения)
Причем, ф-ия FY ставит в соответсвие одной тройке аргументов Y1,Y2,Y3 одно значение Y0,
а ф-ия FZ сопоставляет одному значению Z0 одну уникальную комбинацию Z1,Z2,Z3. Т.е. имеет место однозначное соответствие.
Реализовать FY,FZ двумя процедурами на унивесальном ЯП или в словестном виде.

К примеру, X0=2

Замечание: изначально предпологается что в 8 байтах хватит места для a,b,c. За это предположение отвечает условие X0=2

Delphist, поправте если не так




Это сообщение отредактировал(а) 4d5a - 20.3.2008, 21:08
PM MAIL   Вверх
4d5a
Дата 20.3.2008, 21:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



но если я правильно понял задачу, Вам уже дали общий метод ее решения (см. далее). В чем вопрос - то еще ????????

Цитата(Akina @  17.3.2008,  21:12 Найти цитируемый пост)
 необходимо определить, какие данные являются избыточными, выбросить их, а из оставшихся составить выражение с однозначным соответствием



Цитата(ama_kid @  18.3.2008,  11:01 Найти цитируемый пост)
N=10000*a+b = 10000*2129+4135=21294135Восстанавливаем числа:a = N\10000 = 2129 (затем превращаем в дробное делением на 100) = 21.29b = N%10000 = 4135 =>41.35c = 100.00 - a - b => 37.36



Это сообщение отредактировал(а) 4d5a - 20.3.2008, 21:27
PM MAIL   Вверх
Delphist
Дата 21.3.2008, 09:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphist Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2145
Регистрация: 3.2.2004
Где: всегда в сети

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



Цитата(4d5a @  20.3.2008,  21:52 Найти цитируемый пост)
амечание: изначально предпологается что в 8 байтах хватит места для a,b,c. За это предположение отвечает условие X0=2

Все правильно, но X0 может меняться от 1 до 5


--------------------
ProcessInfo 1-ая моя программа (аналог spyxx.exe с гораздо большим функц-ом - внедрение dll в адр. простр. процесса, перехват API-функций, разбор приложения на окна мн.др).
Когда-то давным-давно использовал это...
PM MAIL ICQ   Вверх
Akina
Дата 21.3.2008, 10:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


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

Репутация: 20
Всего: 454



Цитата(Delphist @  21.3.2008,  10:51 Найти цитируемый пост)
X0 может меняться от 1 до 5 

Значит X0 = 5. Итого требуется хранение числа, состоящего из максимум 7 цифр. Следовательно:

(long*64) Hash = 2**32 * (long*32) (a * 10**5) + (long*32) (b * 10**5)


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

Форум "Алгоритмы" предназначен для обсуждения вопросов, связанных только с алгоритмами и структурами данных, без привязки к конкретному языку программирования и/или программному продукту.


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

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


 




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


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

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