Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как одном числе хранить сумму трех чисел, с обратной возможность декодирования 
:(
    Опции темы
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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Алгоритмы"

maxim1000

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


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

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


 




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


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

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