Показать полную графическую версию : Несколько цифер в одной цифре
Привет всем. Вопрос такой:
Функция должна возвратить одно число. В теле функции происходит выбор этого числа из нескольких вариантов, например 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
Не особо понятно, что же именно надо.
К примеру, есть числа a=1, b=2, c=3
Складываем a+b, получаем 3. И в чем суть вопроса с математической точки зрения? Складывались ли a и b, или просто 0+3? или -5+8 ?
Delirium, Короче получаю переменную x, что в ней я не знаю, но имею диапазон чисел , которые или комбинацию которых может содержать переменная x.
Какие математические операции мне надо проделать? Упрощает задачу то, что числа в переменной x не могут повторяться...
если используется только операция сложения, то это задача линейной алгебры. Линейная операция, которая преобразует несколько переменных в одну является вырожденной:
x ? ?
code_a 1 0 0 матрица преобразования вырожденная,
code_b 1 0 0 однознаяного обратного
code_c 1 0 0 преобразования не существует
выход один: разносить по битам, любо другим способом сделать матрицу преобразования невыроденной и возвращать N независимых значений (столько, сколько было переменных)
В общем, это довольно банальная задачка, если по битам разносить.
Получается, что функция возвращает числа из пяти переменных: 1, 2, 4, 8, 16.
Скажем, нужно вернуть первое, третье и четвёртое число. Сумма получается 1+4+8=13. Никаким другим способом 13 получить из этих чисел нельзя.
Линейная операция, которая преобразует несколько переменных в одну является вырожденной: »
Конечно интересно звучит...возвращать 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 ...)
Скажем, нужно вернуть первое, третье и четвёртое число. Сумма получается 1+4+8=13. Никаким другим способом 13 получить из этих чисел нельзя. »
Да дошло уже :)
CyberDaemon
06-11-2008, 11:09
В теле функции происходит выбор этого числа из нескольких вариантов, например 1, 2 или 3. »
Если варианты - однозначные числа, то пусть функция возвращает 1, 20 или 300 - первый десятичный разряд для первого числа, второй для второго, третий - для третьего.
Тогда, к примеру, возвращенный результат 321 означает, что функция вернула и 1 и 2 и 3.
Думаю можно развить мысль и зделать так переменная содержит два значения a = { 1, 2 } ; b= { 2, 4 }; c= { 3, 8 }; d= { 4, 16 };
Таким образом первое значение простое число, второе разнесенное по битам значение этого числа
Тогда складывая a + b , беру вторые значения и складывваю их. Получится так или нет ?
Тогда, к примеру, возвращенный результат 321 означает, что функция вернула 1 и 2 и 3. »
Точно, даже не подумал че-то.
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.