Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Программирование и базы данных (http://forum.oszone.net/forumdisplay.php?f=21)
-   -   Несколько цифер в одной цифре (http://forum.oszone.net/showthread.php?t=122110)

___oj 06-11-2008 08:46 944596

Несколько цифер в одной цифре
 
Привет всем. Вопрос такой:
Функция должна возвратить одно число. В теле функции происходит выбор этого числа из нескольких вариантов, например 1, 2 или 3.

Пример:
Код:

if(  x=a ) code = 1;
if(  x=b ) code = 2;
if(  x=c ) code = 3;

...

return code;

Но как вернуть, например, из трех вариантов, значения двух вариантов, а потом разложить число и выяснить какие варианты в нем заключены?
Пример:
Код:

if(  x=a ) code_a = 1;
if(  x=b ) code_b = 2;
if(  x=c ) code_c = 3;

...

code = code_a + code_b;
return code;

Полученную переменную code надо спросить, содержит ли она в себе code_a, code_b или code_с, или их любую комбинацию...

Сразу напрашиваетс решение с включением определенног бита в переменной code, но хочется узнать математическое решение этого вопроса. Именно как разложить число и выяснить не содержит ли оно в себе значения заранее определенных вариантов. Значения могут быть любыми, не обязательно 1, 2 и 3, а например 2, 4 и 8 лишь бы решалось.

PS: Математику забыл совсем :)


Проще говоря: Как раздожить число на числа из заданного диапазона значений?

Delirium 06-11-2008 08:53 944601

Не особо понятно, что же именно надо.
К примеру, есть числа a=1, b=2, c=3
Складываем a+b, получаем 3. И в чем суть вопроса с математической точки зрения? Складывались ли a и b, или просто 0+3? или -5+8 ?

___oj 06-11-2008 09:12 944612

Delirium, Короче получаю переменную x, что в ней я не знаю, но имею диапазон чисел , которые или комбинацию которых может содержать переменная x.

Какие математические операции мне надо проделать? Упрощает задачу то, что числа в переменной x не могут повторяться...

pva 06-11-2008 10:23 944684

если используется только операция сложения, то это задача линейной алгебры. Линейная операция, которая преобразует несколько переменных в одну является вырожденной:
Код:

            x ? ?
code_a 1 0 0    матрица преобразования вырожденная,
code_b 1 0 0    однознаяного обратного
code_c 1 0 0    преобразования не существует

выход один: разносить по битам, любо другим способом сделать матрицу преобразования невыроденной и возвращать N независимых значений (столько, сколько было переменных)

Coutty 06-11-2008 10:47 944712

В общем, это довольно банальная задачка, если по битам разносить.
Получается, что функция возвращает числа из пяти переменных: 1, 2, 4, 8, 16.
Скажем, нужно вернуть первое, третье и четвёртое число. Сумма получается 1+4+8=13. Никаким другим способом 13 получить из этих чисел нельзя.

___oj 06-11-2008 10:54 944721

Цитата:

Цитата pva
Линейная операция, которая преобразует несколько переменных в одну является вырожденной: »

Конечно интересно звучит...
Цитата:

Цитата pva
возвращать N независимых значений »

Помоему это я делаю пытаясь решить так:
Все дело в диапазоне значений
Диапазон 2, 4, 8, 16
Имею переменную x = (16 + 8 + 4 + 2) = 30
Шагаю от наибольшего числа из диапазона = 16
30 - 16 = 14
Здвигаюсь на одно значение диапазона = 8
14 - 8 = 6
Здвигаюсь на одно значение диапазона = 4
6 - 4 = 2
Здвигаюсь на одно значение диапазона = 2
2 - 2 = 0
Таким обоазом выясняю что переменная x содержит 16, 8, 4 и 2


Имею переменную x = (8 + 4 + 2) = 14
Шагаю от наибольшего числа из диапазона = 16
т.к 14 < 16 Здвигаюсь на одно значение диапазона = 8
14 - 8 = 6
Здвигаюсь на одно значение диапазона = 4
6 - 4 = 2
Здвигаюсь на одно значение диапазона = 2
2 - 2 = 0
Таким обоазом выясняю что переменная x содержит 8, 4 и 2

Извиняюсь за неграмотность.
Так можно безошибочно определять какие числа содержит переменная x
(если зачения разнесены по битам 2, 4, 8, 16 ... Хотя изначально речь шла о диапазоне чисел 1, 2, 3, 4 ...)

Цитата:

Цитата Coutty
Скажем, нужно вернуть первое, третье и четвёртое число. Сумма получается 1+4+8=13. Никаким другим способом 13 получить из этих чисел нельзя. »

Да дошло уже :)

CyberDaemon 06-11-2008 11:09 944741

Цитата:

Цитата ___oj
В теле функции происходит выбор этого числа из нескольких вариантов, например 1, 2 или 3. »

Если варианты - однозначные числа, то пусть функция возвращает 1, 20 или 300 - первый десятичный разряд для первого числа, второй для второго, третий - для третьего.
Тогда, к примеру, возвращенный результат 321 означает, что функция вернула и 1 и 2 и 3.

___oj 06-11-2008 11:17 944747

Думаю можно развить мысль и зделать так переменная содержит два значения a = { 1, 2 } ; b= { 2, 4 }; c= { 3, 8 }; d= { 4, 16 };
Таким образом первое значение простое число, второе разнесенное по битам значение этого числа

Тогда складывая a + b , беру вторые значения и складывваю их. Получится так или нет ?

Цитата:

Цитата CyberDaemon
Тогда, к примеру, возвращенный результат 321 означает, что функция вернула 1 и 2 и 3. »

Точно, даже не подумал че-то.


Время: 04:46.

Время: 04:46.
© OSzone.net 2001-