¿Me ayudan con un problema de matemáticas?

JALF

Lanero Reconocido
28 Feb 2007
979
Hola a todos

Traigo un pequeño problema de matemáticas que debo aplicar en programación, el problema es el siguiente:

Tengo los siguientes números 1, 2, 4, 8, 16 y 32; cualquier combinación da un número del 1 al 63, ejemplo 1+2+4+8+16+32 = 63 otro ejemplo 2+8+32 = 42 otro ejemplo 1+4 = 5

La cosa es que a mi me dicen lo siguiente demuestre matemáticamente el número 16 se encuentra en la combinación de números que se deben sumar para llegar a 49.

Dicho de otra forma sería:

Sabemos que para llegar a 49 con el siguiente conjunto de número (1, 2, 4, 8, 16 y 32) existe solo una combinación que sumada llega a dicho resultado, demuestre matemáticamente que el número 16 está o no está en dicha combinación para poder llegar al resultado.

Espero que me puedan dar una manito con este pequeño dilema. De ante mano muchas gracias por la ayuda que me puedan prestar.

Salu2
 
Matemáticamente no tengo la respuesta pero en programación es:

If (16 And 49) Then
MsgBox("ok")
End If

o

if(16&49)
{
//true valor
}

Hola que tal, gracias, igual no interesa si la respuesta está en programación o si está en forma matemática pero..... la verdad no comprendí mucho.

Se supone que yo voy a averiguar si en la combinación que utilizo para llegar a 49 está el 16, así como tu me muestras ahí.... no veo por donde le busca :S ¿me comprendes?
 
Por lo que yo entiendo tenes que buscar alguna combinacion de 2 (o mas) valores de ese conjunto sin repetirlos, teniendo en cuenta que se tiene que usar si o si el 16, una solucion es 16+32+1=49
Pensando en programacion, se me ocurre algo como un array con el conjunto e ir recorriendolo con un valor fijo (el 16) e ir sumandole algun otro, despues preguntando si es mayor o menor a 49, cuando da falso es porque es igual a 49 y muestra la combinacion de los numeros.
Espero haberme explicado bien xD
Saludos! :)
 
Hola de nuevo a todos y gracias a quienes pensaron en ayudarme, pero listo con la explicación de un amigo que trabaja programando chips.... listo fui capaz de resolverlo y aquí pongo la respuesta para quien esté interesado

El problema real es el siguiente: yo tengo 6 clases de permisos identificados de la siguiente manera
1 = Consultar
2 = Insertar
4 = Modificar
8 = Imprimir
16 = Borrar Lógico
32 = Borrar Físico​
Quienes se estén preguntando "y aja, y por que no dices que el 3 es Modificar y el 5 Imprimir y así", pues resulta y acontece que en esta tabla que pongo a continuación, algo larga explico el porque no hago eso:
1 Consultar
2 Insertar
3 Consultar.Insertar
4 Modificar
5 Modificar.Consultar
6 Modificar.Insertar
7 Modificar.Consultar.Insertar
8 Imprimir
9 Imprimir.Consultar
10 Imprimir.Insertar
11 Imprimir.Consultar.Insertar
12 Imprimir.Modificar
13 Imprimir.Modificar.Consultar
14 Imprimir.Modificar.Insertar
15 Imprimir.Modificar.Consultar.Insertar
16 Borrar Lógico
17 Borrar Lógico.Consultar
18 Borrar Lógico.Insertar
19 Borrar Lógico.Consultar.Insertar
20 Borrar Lógico.Modificar
21 Borrar Lógico.Modificar.Consultar
22 Borrar Lógico.Modificar.Insertar
23 Borrar Lógico.Modificar.Consultar.Insertar
24 Borrar Lógico.Imprimir
25 Borrar Lógico.Imprimir.Consultar
26 Borrar Lógico.Imprimir.Insertar
27 Borrar Lógico.Imprimir.Consultar.Insertar
28 Borrar Lógico.Imprimir.Modificar
29 Borrar Lógico.Imprimir.Modificar.Consultar
30 Borrar Lógico.Imprimir.Modificar.Insertar
31 Borrar Lógico.Imprimir.Modificar.Consultar.Insertar
32 Borrar Físico
33 Borrar Físico.Consultar
34 Borrar Físico.Insertar
35 Borrar Físico.Consultar.Insertar
36 Borrar Físico.Modificar
37 Borrar Físico.Modificar.Consultar
38 Borrar Físico.Modificar.Insertar
39 Borrar Físico.Modificar.Consultar.Insertar
40 Borrar Físico.Imprimir
41 Borrar Físico.Imprimir.Consultar
42 Borrar Físico.Imprimir.Insertar
43 Borrar Físico.Imprimir.Consultar.Insertar
44 Borrar Físico.Imprimir.Modificar
45 Borrar Físico.Imprimir.Modificar.Consultar
46 Borrar Físico.Imprimir.Modificar.Insertar
47 Borrar Físico.Imprimir.Modificar.Consultar.Insertar
48 Borrar Físico.Borrar Lógico
49 Borrar Físico.Borrar Lógico.Consultar
50 Borrar Físico.Borrar Lógico.Insertar
51 Borrar Físico.Borrar Lógico.Consultar.Insertar
52 Borrar Físico.Borrar Lógico.Modificar
53 Borrar Físico.Borrar Lógico.Modificar.Consultar
54 Borrar Físico.Borrar Lógico.Modificar.Insertar
55 Borrar Físico.Borrar Lógico.Modificar.Consultar.Insertar
56 Borrar Físico.Borrar Lógico.Imprimir
57 Borrar Físico.Borrar Lógico.Imprimir.Consultar
58 Borrar Físico.Borrar Lógico.Imprimir.Insertar
59 Borrar Físico.Borrar Lógico.Imprimir.Consultar.Insertar
60 Borrar Físico.Borrar Lógico.Imprimir.Modificar
61 Borrar Físico.Borrar Lógico.Imprimir.Modificar.Consultar
62 Borrar Físico.Borrar Lógico.Imprimir.Modificar.Insertar
63 Borrar Físico.Borrar Lógico.Imprimir.Modificar.Consultar.Insertar
Pues bien, resulta que estoy implementando en mi plataforma de desarrollo, el sistema de permisos y la idea es que a un usuario solo le pueden dar los permisos (1, 2, 4, 8, 16 y 32) y cuando consultamos esos permisos a la base de datos, la idea es sacar la sumatoria de los permisos asignados y que luego cuando el usuario va a entrar a un modulo, el modulo me diga "vea para usted entrar aquí debe de tener los siguientes permisos 2+16 = 18" y yo llego y le digo al modulo "viejo pues yo tengo estos permisos 2 + 16 + 32 = 50" entonces llamo la función que me evalúa los permisos y me dice "vea modulo, el usuario tiene los permisos que usted exige para ingresar"

:alien: :alien: :alien: :alien: ¿capisci? jejejejejejeje :p :p :p :p :p
y aquí dejo lo que escribí en PHP para poder hacer esto y ya me funciona bien :)

PHP:
function permiso($tengo,$necesito) {
  $cmp = $tengo & $necesito;
  $rsp = ($cmp == $necesito) ? "VERDADERO" : "FALSO" ;
  return $rsp;
}

// Por tanto nuestra respuesta es verdadera y nos dejaría entrar al modulo
$permiso = 50; // Sumatoria de permisos asignados por el Administrador (2 + 16 + 32 = 50)
$necesario = 18; // Sumatoria de permisos necesarios para entrar al modulo (2 + 16 = 18)
echo permiso($permiso, $necesario);

// En este ejemplo nuestra respuesta es falsa y no podríamos entrar al modulo
$permiso = 52; // Sumatoria de permisos asignados por el Administrador (4 + 16 + 32 = 50)
$necesario = 18; // Sumatoria de permisos necesarios para entrar al modulo (2 + 16 = 18)
echo permiso($permiso, $necesario);
Para quienes se estén preguntando "y que es eso de $cmp = $tengo & $necesito;" pues bien, es una operación binaria donde se activan los bits que están tanto en $tengo como en $necesito. Mejor dicho esto se ve mejor con un ejemplito:

18 -> 00010010 ($tengo)
50 -> 00110010 ($necesito)
18 -> 00010010 ($tengo & $necesito)

Otro ejemplito
31 -> 00011111 ($tengo)
16 -> 00010000 ($necesito)
16 -> 00010000 ($tengo & $necesito)

Bueno espero que esta solución a mi duda, le sirva a alguien para futuras implementaciones de sistemas de permisos ;)

Salu2

Fuente de información adicional aquí
 
:llamas:

Estuve analizando, y ..
1. no veo el por que al tener que la variable $cmp es igual a la variable $necesito, llegas a la conlusion de que 50 tiene en sus sumandos los sumandos de 18.

2. si incluyeras mas posibilidades de permisos por ejemplo el tres, ya pudieras obeneter un mismo numero con diferentes sumas.

3. asumo que te estas basando en le hecho de que con esos 5 numeros, no hay dos combinaciones diferentes para obener un mismo sumando.
 
:llamas:

Estuve analizando, y ..
1. no veo el por que al tener que la variable $cmp es igual a la variable $necesito, llegas a la conlusion de que 50 tiene en sus sumandos los sumandos de 18.

2. si incluyeras mas posibilidades de permisos por ejemplo el tres, ya pudieras obeneter un mismo numero con diferentes sumas.

3. asumo que te estas basando en le hecho de que con esos 5 numeros, no hay dos combinaciones diferentes para obener un mismo sumando.

Hola que tal, bueno te respondo punto a punto :p

1. Es verdad, la variable $cmp y la variable $rsp se pueden omitir quedando el código de la siguiente manera:
PHP:
function permiso($tengo,$necesito) { 
  return (($tengo & $necesito) == $necesito) ? TRUE : FALSE; 
}

2. Esa parte está respondida en el post anterior al tuyo, en donde dice "Click aquí para ver el texto escondido" pero de todas maneras te explico, si deseas incluir más permisos, entonces el que sigue sería el último permiso por dos quedando los permisos así (1, 2, 4, 8, 16, 32..... (n*2)) osease el siguiente permiso sería 64 y el máximo de permisos disponibles se elevaría a 127 (1+2+4+8+16+32+64) para garantizar que solo existe una forma de llegar a esos números, eso es como una serie de Fibonacci o eso creo :p ¿capisci? :p

3. Tu mismo lo has dicho "no hay dos combinaciones diferentes para obener un mismo permiso" ;)

Salu2
 

Los últimos temas