Está en la página 1de 5

PROBLEMA: Desarrollar un programa que dado un numero entero, positivo y que no tiene

el cero entre sus dígitos, obtenga a partir de él otro numero que no es mas que el numero
dado con sus dígitos ordenados de mayor a menor.

Por ejemplo si N=217635 el nuevo numero obtenido será NN=765321

ANALISIS:
Efectuando un análisis del problema y sub-dividiéndolo se puede ver que la solución puede
darse dividiendo el problema en los siguientes sub-problemas:

• Leer un entero
• Hallar el mayor digito de los que existen
• Incorporar este digito mayor al nuevo numero
• Eliminarlo este digito mayor del numero leído para la siguiente iteración
• Ubicar la posición del digito mayor para poder eliminarlo.
• El programa principal que dirija el proceso con estos sub-programas, digito a digito.

SOLUCION:

Programa OrdenarDigitosDeUnNumero()
Int NN,N,D,P,k
INICIO
NN  0 // NN sera el nuevo numero con dígitos ordenados
N  leerEntero() : nd  numDigitos() // N es el numero con el que se inicia
Para k=1, nd
D  digitoMayor(N) // pedimos el digito mayor de N en D
NN  NN*10 + D // formando el nuevo numero en NN
P  posDigitoMayor(N,D) // buscando la ubicación de D para eliminarlo
N  eliminaDigitoMayor(N,P) // eliminar D de la ubicación P
FinPara
Mostrar NN
FIN

// N es el numero con el que se trabaja


Funcion digitoMayor(int N)
Int dm, d
INICIO
dm  -1 // dm contendrá el digito mayor
Mientras (N > 0)
d  N MOD 10 : N  N DIV 10 // d contiene un digito a la vez de N
Si d > dm
Entonces dm  d
FinSi
FinMientras
Devolver dm
FIN
// N es el numero y dd el digito cuya ubicación se quiere averiguar
Funcion posDigitoMayor(int N, int dd)
Int pos, b, d
INICIO
pos  0 : b  0
Mientras (b=0)
d  N MOD 10 : N  N DIV 10 // recorremos el numero digito a digito
Si d = dd // ubicamos al digito mayor y retornamos esa ubicación
Entonces b1
Sino pos  pos + 1
FinSi
FinMientras
Devolver pos
FIN

// N es el numero y P la ubicación del digito a eliminar


Funcion eliminaDigitoMayor(int N, int P)
Int C, NR, d
INICIO
C0 // C ira indicando las posiciones de los digitos
NR  0 // NR sera el numero resultante después de eliminar
Mientras (N>0)
d  N MOD 10 : N  N DIV 10 // vamos recorriendo digito a digito en N
Si C <> P // si no es la posición del que debemos eliminar
Entonces NR  NR + d*10^C : C  C + 1 // reconstruimos sin el
FinSi // si es igual no participa del numero resultante NR
FinMientras
Devolver NR // devuelve el numero reconstruido y sin el que se quería eliminar
FIN

PROBLEMA: Suma de números binarios

Un numero decimal (base 10) es un numero en el que cada uno de sus digitos es uno de los
siguientes: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 y un numero binario (base 2) es un numero en el que
cada uno de sus digitos es uno de los siguientes: 0 o 1. Se quiere que leido un numero
decimal entero y positivo que indique la cantidad de numeros a sumar (por ejemplo N), leer
numeros binarios (verificando que si lo sean) y efectuar la suma de estos numeros binarios,
es decir efectuar las sumas en binario.

Ejemplo: dados A=1001 y B=1111 la se hace de la siguiente manera:


1 1 1  lo que se lleva (el acarreo)
1001 el numero A
+ 1111 el numero B
11000
NOTA: 1+1 es 2 y se escribe 10 en binario (se anota el 0 y se lleva o acarrea el 1)
1+0 es 1 y se escribe simplemente 1 (se anota el 1 y no se lleva nada)
0+0 es 0 y se escribe simplemente 0 (se anota el 0 y no se lleva nada)
1+1+1 es 3 y se escribe 11 en binario (se anota el 1 y se lleva el 1)

ANALISIS:
Efectuando un análisis del problema y sub-dividiéndolo se puede ver que la solución puede
darse dividiendo el problema en los siguientes sub-problemas:
• Leer un numero entero, que ya se tiene
• Leer un numero binario, verificando que si lo sea
• Contar dígitos de un numero
• Suma de binarios
• Programa principal que maneje los anteriores

SOLUCION:

Programa SumaBinaria()
Int suma, N,K,X
INICIO
suma  0
N  leerEntero() // ya se tiene la funcion leeEntero()
Para K=1, N
X  leerNumeroBinario()
suma  suma2Binarios(suma, X)
FinPara
Mostrar “El resultado es: ”, suma
FIN

// funcion que hace la suma binaria de 2 números supuestamente binarios


Funcion suma2Binarios(int p, int q)
Int ndp, // el numero de dígitos de p
ndq, // el numero de dígitos de q
dp, dq // un digito de p y uno de q respectivamente
may, // el mayor entre ndp y ndq
t, // la suma del digito de p + el digito de q + el acarreo
anoto, // el digito que se anota al resultado que se acumula en result
acarreo, // el digito que se acarrea
result // el resultado final de la suma de los 2 binarios
INICIO
ndp  numDigitos(p) // obtenemos la cantidad de digitos de p
ndq  numDigitos(q) // obtenemos la cantidad de digitos de q
Si ndp > ndq // vemos cual de los 2 es el mayor
Entonces may  ndp
Else may  ndq
FinSi
result  0 : acarreo  0
Para K=0, may-1
dp  p MOD 10 : dq  q MOD 10 : p  p DIV 10 : q  q DIV 10
t dp + dq + acarreo // t puede ser 0, 1, 2 o 3
Caso t Hacer
0 : anoto  0 : acarreo  0
1 : anoto  1 : acarreo  0
2 : anoto  0 : acarreo  1
3 : anoto  1 : acarreo  1
finCaso
result  result + anoto*10^K
FinPara
Si acarreo = 1 // si resta algo en el acarreo
Entonces result  result + anoto*10^(K+1)
FinSi
Devolver result
FIN

// lee un numero y verifica si es positivo y binario


Funcion LeerNumeroBinario()
Int b, num
INICIO
b0
Mientras (b=0)
Mostrar “Digite un numero binario (base 2)” : leer num
Si num > 0
Entonces
resp  verificaSiEsBinario(num)
Si resp = 0 // resp = 1 si no es binario
Entonces b  1 // para salir del mientras
FinSi
FinSi
FinMientras
Devolver num // devuelve un numero binario
FIN

// funcion que verifica si x es o no un numero binario


Funcion verificaSiEsBinario(int x)
Int b, dig
INICIO
b0
Mientras (x >0)
dig  x MOD 10 : x  x DIV 10
Si dig <> 0 AND dig <> 1
Entonces b  1
FinSi
FinMientras
Devolver b // devuelve 0 si es binario y 1 si no lo es
FIN

// Sub-programa que cuenta los digitos de un numero entero


Funcion numDigitos( int N)
Int C
INICIO
C0
Mientras (N>0)
N  INT (N/10)
CC+1
FinMientras
Devolver C
FIN