s1Eva_IIT2010_T3 Juego del amigo secreto

Ejercicio: 1Eva_IIT2010_T3 Juego del amigo secreto

[ algoritmo ] [ diagrama flujo ]

http://www.fabu.com.ec/2017/12/22/ideas-para-el-amigo-secreto/
http://www.fabu.com.ec/2017/12/22/ideas-para-el-amigo-secreto/

Inicie preguntando el número de parejas que van a participar.

Por simplicidad, considere solo una pareja para luego realizarlo para n parejas .

El sorteo se registra con arreglos/vectores que contienen las banderas de amigo/amiga en cero,

AmigA = np.zeros(n+1,dtype=int)
AmigO = np.zeros(2*n+1,dtype=int)

para poner luego el valor sorteado a cada uno, si aún no se ha repetido.

dama = int(rnd.random()*n)+(n+1)

El valor repetido se verifica revisando el estado del arreglo en la posición correspondiente, esperando que sea vacio AmigO[dama]==0, solo allí se asigna el amigo y se pasa al siguiente sorteo.

# sortea dama para cada AmigO
i = 1
while (i<=n):
    dama = int(rnd.random()*n)+(n+1)
    if (AmigO[dama]==0):
        AmigO[dama] = i
        i = i+1

ser repite el mismo proceso para el otro género.

[ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2010_T3 Juego del amigo secreto
# Propuesta de solucion. edelros@espol.edu.ec

import numpy as np
import random as rnd

# INGRESO
n = int(input('¿número de parejas?: '))

# PROCEDIMIENTO
AmigA = np.zeros(n+1,dtype=int)
AmigO = np.zeros(2*n+1,dtype=int)

# sortea dama para cada AmigO
i = 1
while (i<=n):
    dama = int(rnd.random()*n)+(n+1)
    if (AmigO[dama]==0):
        AmigO[dama] = i
        i = i+1

# sortea caballero para cada AmigA
j = n+1
while (j<=(2*n)):
    caballero = int(rnd.random()*n)+1
    if (AmigA[caballero]==0):
        AmigA[caballero] = j
        j = j+1

# SALIDA
print('pareja de caballeros')
i = 1
while (i<=n):
    print(i,' , ',AmigA[i])
    i = i+1
    
print('pareja de damas')
j = n+1
while (j<=(2*n)):
    print(j,' , ',AmigO[j])
    j = j+1

Resultado del algoritmo

¿número de parejas?: 4
pareja de caballeros
1  ,  5
2  ,  8
3  ,  7
4  ,  6
pareja de damas
5  ,  3
6  ,  4
7  ,  1
8  ,  2
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo

[ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_iit2010_t3 pdf

ejercicios resueltos Matlab 1eva_iit2010_t3 pdf

s1Eva_IIT2010_T2 Venta de pasajes tren turístico

Ejercicio: 1Eva_IIT2010_T2 Venta de pasajes tren turístico

[ algoritmo ] [ diagrama flujo ] locomotora tren dibujo

Inicialmente desarrolle la venta para un solo pedido/comprador, así encontrará las partes principales de la venta y hace el primer esquema del procedimiento a seguir.

pedido = int(input('¿cuántos pasajes?: '))
print('   Monedas: 1.Dolar 2.Euro 3.Peso')
moneda = int(input(' ¿Tipo Moneda?: '))
cantidad = float(input(' ¿Cantidad de Dinero?: '))

if (moneda==1):
    valor = cantidad*pesodolar
if (moneda==2):
    valor = cantidad*pesoeuro
if (moneda==3):
    valor = cantidad

pago=pedido*precio

En una segunda versión, agregue las demás opciones de control, tales como contadores y acumuladores para controlarlos turnos o la venta de asientos del tren.

En este proceso se añade un lazo para repetir, y se termina mostrando los resultados de boletos vendidos, el dinero cobrado y el total devuelto.

Tarea: Prestar atención en la venta cuando quedan pocos boletos y el usuario quiere comprar más de los que están disponibles.

[ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2010_T1 Venta de pasajes tren turístico
# Propuesta: edelros@espol.edu.ec

turnomax = int(input('¿cuántos turnos?: '))
capacidad = int(input('capacidad del tren?: ')) 

pesodolar = 2.50
pesoeuro  = 3.25
precio    = 7.00
vendido   = 0
cobrado   = 0.00
devuelto  = 0.00

turno = 1
while (turno<=turnomax and vendido<=capacidad):
    print('Turno:')
    print(turno)
    pedido = int(input('¿cuántos pasajes?: '))
    print('   Monedas: 1.Dolar 2.Euro 3.Peso')
    moneda = int(input(' ¿Tipo Moneda?: '))
    cantidad = float(input(' ¿Cantidad de Dinero?: '))

    if (moneda==1):
        valor = cantidad*pesodolar
    if (moneda==2):
        valor = cantidad*pesoeuro
    if (moneda==3):
        valor = cantidad

    pago=pedido*precio
    if (pago<=valor and((vendido+pedido)<capacidad)):
        vendido = vendido+pedido
        cobrado = cobrado+pago
        cambio  = valor-pago
        devuelto = devuelto+cambio

        print('Se vendieron Boletos: ')
        print(pedido)
        print('su cambio: ')
        print(cambio)
    else:
        print('no es dinero suficiente')

    turno = turno + 1

# SALIDA
print('pasajes vendidos: ')
print(vendido)
print('pesos cobrados: ')
print(cobrado)
print('pesos devueltos: ')
print(devuelto)

Resultado del algoritmo

¿cuántos turnos?: 3
capacidad del tren?: 50
Turno:
1
¿cuántos pasajes?: 3
   Monedas: 1.Dolar 2.Euro 3.Peso
 ¿Tipo Moneda?: 1
 ¿Cantidad de Dinero?: 20
Se vendieron Boletos: 
3
su cambio: 
29.0
Turno:
2
¿cuántos pasajes?: 4
   Monedas: 1.Dolar 2.Euro 3.Peso
 ¿Tipo Moneda?: 2
 ¿Cantidad de Dinero?: 20
Se vendieron Boletos: 
4
su cambio: 
37.0
Turno:
3
¿cuántos pasajes?: 2
   Monedas: 1.Dolar 2.Euro 3.Peso
 ¿Tipo Moneda?: 3
 ¿Cantidad de Dinero?: 30
Se vendieron Boletos: 
2
su cambio: 
16.0
pasajes vendidos: 
9
pesos cobrados: 
63.0
pesos devueltos: 
82.0
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo

Venta de pasajes tren turístico 01

 

Venta de pasajes tren turístico 02

 

Venta de pasajes tren turístico 03

[ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_iit2010_t2 pdf

ejercicios resueltos Matlab 1eva_iit2010_t2 pdf

s1Eva_IIT2010_T1 Censo de instrucción por género

Ejercicio: 1Eva_IIT2010_T1 Censo de instrucción por género

[ algoritmo ] [ diagrama flujo ]

Los datos se almacenan en vectores y se los tabula/cuenta en una matriz.  Las filas representan la instrucción y columna el género.

Lista de género y nivel de instrucción:
i Género [i] Instrucción [i] Género:
1. Masculino
2. FemeninoInstrucción:
1. Primaria
2. Secundaria
3. Superior
1 1 2
2 2 3
3 1 3
n

Se usará desde la casilla 1, por lo que el tamaño del arreglo es n+1 al no usar la casilla cero.

n = int(input('¿Cuántos formularios: '))

genero = np.zeros(n+1,dtype=int)
instruccion = np.zeros(n+1,dtype=int)
i = 1
while not(i>n):
    print('Formulario:',i)
    genero[i] = int(input('  genero: '))
    instruccion[i] = int(input('  instruccion: '))
    i = i+1

Se inicializan los contadores al inicializar la matriz para luego procesar los datos de todos los formularios registrados.

Instrucción por género:
Masculino Femenino
Primaria
Secundaria
Superior

Para facilitar la lectura del algoritmo se usan como variables f y c para referenciar las filas y columnas. Una forma más larga de solución podría usar contadores individuales para contar primaria/masculino, primaria/femenino, etc.

Tarea: validar el ingreso de género e instrucción por cada formulario

[ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2010_T1 Censo de instrucción por género
# propuesta: edelros@espol.edu.ec

import numpy as np

#INGRESO
n = int(input('¿Cuántos formularios: '))

genero = np.zeros(n+1,dtype=int)
instruccion = np.zeros(n+1,dtype=int)

i = 1
while not(i>n):
    print('Formulario:',i)
    genero[i] = int(input('  genero: '))
    instruccion[i] = int(input('  instruccion: '))
    i = i+1

# PROCEDIMIENTO
tabla = np.zeros(shape=(3+1,2+1),dtype=int)
i = 1
while not(i>n):
    f = instruccion[i]
    c = genero[i]
    tabla[f,c] = tabla[f,c]+1
    i = i + 1

# SALIDA
print('Instr  M  F ')
f = 1
while not(f>3):
    c = 1
    cadena = ''
    while not(c>2):
        cadena = cadena+' '+str(tabla[f,c])
        c = c + 1
    print('   '+str(f)+': '+cadena)
    f = f + 1

Resultado del algoritmo

¿Cuántos formularios: 5
Formulario: 1
  genero: 1
  instruccion: 2
Formulario: 2
  genero: 1
  instruccion: 2
Formulario: 3
  genero: 2
  instruccion: 1
Formulario: 4
  genero: 2
  instruccion: 1
Formulario: 5
  genero: 2
  instruccion: 3
Instr  M  F 
   1:  0 2
   2:  2 0
   3:  0 1
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama Flujo: Mientras-Repita

Diagrama de Flujo 1eva_iit2010_t1 01Diagrama de Flujo 1eva_iit2010_t1 02

[ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_iit2010_t1 pdf

ejercicios resueltos Matlab 1eva_iit2010_t1 pdf

s1Eva_IT2010_T2 Número Omirp

Ejercicio: 1Eva_IT2010_T2 Número Omirp

[ algoritmo ] [ diagrama flujo ]

Nota: Omirp se lee de derecha a izquierda como primo.Número OMIRP

Repasar algoritmo de validación de números primos, también el algoritmo para invertir dígitos de un número. En este ejercicio es necesario usar ambos.

Primero para verificar si el número a verificar es primo, inicia suponiendo que es primo y busca probar lo opuesto.

# revisa si es primo
esprimo = 1
i = 2
while (i<n):
    r = n%i
    if r==0:
        esprimo = 0
    i = i+1

luego para invertir sus dígitos, usando residuo de 10 y cociente.
Los residuos se añaden como unidades al número al revés multiplicado por 10

Ejemplo
número 1597 159 15 1
residuo 7 9 5 1
cociente 159 15 1 0
al revés 0*10+7 = 7 7*10+9 = 79 79*10+5 = 795 7951
# invierte los dígitos del número
m = n
alreves = 0
while (m>0):
    r = m%10
    m = m//10
    alreves = alreves*10 + r

Finalmente verificar si el número con dígitos invertidos también es primo.

# revisa si es omirp
if (esprimo==1 and esprimoA==1):
    omirp = 1
else:
    omirp = 0

Si ambos son primos entonces el número es omirp.

[ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2010_T2 Número Omirp
# Propuesta: edelros@espol.edu.ec

# INGRESO
n = int(input('numero a validar omirp: '))

# PROCEDIMIENTO

# revisa si es primo
esprimo = 1
i = 2
while (i<n):
    r = n%i
    if r==0:
        esprimo = 0
    i = i+1

# invierte los dígitos del número
m = n
alreves = 0
while (m>0):
    r = m%10
    m = m//10
    alreves = alreves*10 + r

# revisa si alreves es primo
esprimoA = 1
i = 2
while (i<alreves):
    r = alreves%i
    if r==0:
        esprimoA = 0
    i = i + 1

# revisa si es omirp
if (esprimo==1 and esprimoA==1):
    omirp = 1
else:
    omirp = 0

# SALIDA
print('es número omirp: ', omirp)

Resultado del algoritmo

numero a validar omirp: 1597
es número omirp:  1
>>> 
numero a validar omirp: 1598
es número omirp:  0
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo

Número Omirp 01

Número Omirp 02

Número Omirp 03

[ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_it2010_t2 pdf

ejercicios resueltos Matlab 1eva_it2010_t2 pdf

s1Eva_IT2010_T1 Bono para televisores en Uruguay

Ejercicio: 1Eva_IT2010_T1 Bono para televisores en Uruguay

Propuesta de solución en Python:

Para el bloque de ingreso de piden la cantidad de modelos, con lo que se puede crear la matriz con columnas cantidad y precio. Se usa una tercera columna para calcular el valor a devolver por cada modelo.

Ejemplo:
Modelo Cantidad Precio Devolver
LCD 250 400 50.000
Plasma 120 1000 60.000
LED 80 3000 120.000
Total a Devolver: 230.000

Se suman los valores a devolver para presentar el resultado.

>>> 
¿cuántos modelos?: 3
modelo num: 0
cantidad:250
precio: 400
modelo num: 1
cantidad:120
precio: 1000
modelo num: 2
cantidad:80
precio: 3000
[[   250    400  50000      0]
 [   120   1000  60000      0]
 [    80   3000 120000      0]]
total a devolver:  230000
>>>

Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2010_T1 Bono para televisores en Uruguay
# Tarea: convertir a listas
# Tarea: ingresar los nombres de los modelos

import numpy as np

# INGRESO
n = int(input('¿cuántos modelos?: '))

tabla  = np.zeros(shape=(n,3), dtype=int)
modelo = 0
while (modelo<n):
    print('modelo num:',modelo)
    tabla[modelo,0] = int(input('cantidad:' ))
    tabla[modelo,1] = int(input('precio: ' ))
    modelo = modelo + 1

# PROCEDIMIENTO
devolver = 0
modelo   = 0
while (modelo<n):
    tabla[modelo,2] = tabla[modelo,0]*tabla[modelo,1]/2
    devolver = devolver+tabla[modelo,2]
    modelo = modelo + 1

# SALIDA
print(tabla)
print('total a devolver: ',devolver)

s1Eva_IT2009_T1 Suma de serie con signo alternado

Ejercicio: 1Eva_IT2009_T1 Suma de serie con signo alternado

mientras-repita: [ algoritmo ] [ diagrama flujo ]
repita-hasta: [ algoritmo ] [ diagrama flujo ]

Solicitar el número n, calcular cada término i-ésimos y acumularlos en una variable s.

1-\frac{1}{2}+\frac{1}{3}-\frac{1}{4}+\frac{1}{5}+\text{...}+\frac{1}{n}

El signo se puede alternar multiplicando una variable signo por -1. También se puede usar (-1)i+1 para alternar el signo.

observe:

(-1)^{(1+1)}1+(-1)^{(2+1)}\frac{1}{2}+(-1)^{(3+1)}\frac{1}{3}+ ...

mientras-repita: [ algoritmo ] [ diagrama flujo ]
repita-hasta: [ algoritmo ] [ diagrama flujo ]

..


Algoritmo en Python: mientras-repita

La primera solución se presenta usando el lazo “Mientras-Repita”

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2009_T1 Suma de serie con signo alternado
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
n = int(input('¿Cuántos términos?: '))

# PROCEDIMIENTO
i = 1
s = 0
signo = 1
while (i<=n):
    s = s + signo*(1/i)
    i = i + 1
    signo = (-1)*signo

# SALIDA
print(s)

resultado del algoritmo

¿Cuántos términos?: 5
0.7833333333333332
>>> 
== RESTART: D:\MATG1052Ejemplos\unprograma.py ==
¿Cuántos términos?: 10
0.6456349206349207
>>> 

mientras-repita: [ algoritmo ] [ diagrama flujo ]
repita-hasta: [ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo: Mientras-Repita

Suma de serie con signo alternado 01
mientras-repita: [ algoritmo ] [ diagrama flujo ]
repita-hasta: [ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python: repita-hasta:

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2009_T1 Suma de serie con signo alternado
# Propuesta de solución. edelros@espol.edu.ec

# INGRESO
n = int(input('¿Cuántos términos?: '))

# PROCEDIMIENTO
i = 1
s = 0
signo = 1
while not(i>n):
    s = s + signo*(1/i)
    i = i + 1
    signo = (-1)*signo

# SALIDA
print(s)

mientras-repita: [ algoritmo ] [ diagrama flujo ]
repita-hasta: [ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo Repita-Hasta

Suma de serie con signo alternado 02

mientras-repita: [ algoritmo ] [ diagrama flujo ]
repita-hasta: [ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1Eva_IT2009_T1 pdf

ejercicios resueltos Matlab 1eva_it2009_t1 pdf

s1Eva_IIT2008_T1 Odómetro OCTAL

Ejercicio: 1Eva_IIT2008_T1 Odómetro OCTAL

[ algoritmo ] [ diagrama flujo ]

Se usa el concepto para cambio de base numérica, se extrae cada dígito para acumular el valor ponderando por cada posición referenciada con la variable i.

Si se usa residuo de la división para 10, el primer dígito a extraer es el menos significativo (unidades).

    r = octal%10

Se acumulan los valores de acuerdo a la ponderación o peso por posición y se repite hasta que no queden dígitos que ponderar.

    octal = octal//10
    decimal = decimal+r*(8**i)

Para repasar: Bases Numéricas Introducción

Tarea: validar que el número es octal (rango de dígitos entre 0-7)

[ algoritmo ] [ diagrama flujo ]

..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IIT2008_T1 Odometro OCTAL
# Propuesta de solución. edelros@espol.edu.ec
# Tarea: Validar que el ingreso sea en octal.

# INGRESO
octal = int(input('¿numero en octal?: '))

# PROCEDIMIENTO
i = 0
decimal = 0
while (octal>0):
    r = octal%10
    octal = octal//10
    decimal = decimal+r*(8**i)
    i = i + 1

# SALIDA
print('valor en decimal: ')
print(decimal)

Resultado del algoritmo

Observación: Tener en cuenta que no se ha validado que el número octal solo debe tener dígitos entre 0 y 7.

¿numero en octal?: 27
valor en decimal: 
23
>>> 
¿numero en octal?: 14
valor en decimal: 
12
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo

[ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_iit2008_t1 pdf

ejercicios resueltos Matlab 1eva_iit2008_t1 pdf

s1Eva_IT2008_T3 Simular Precio del Petróleo

Ejercicio: 1Eva_IT2008_T3 Simular Precio del Petróleo

[ algoritmo ] [algoritmo con vector ] [ diagrama flujo ]

Se ingresa la cantidad de días del mes, promedio valores grafico
o se puede considerar directamente 30.

También es opcional ingresar el rango de precio mínimo y precio máximo, que son los límites del número aleatorio.

Para la pregunta a) se calcula el promedio como el acumulado de precios de cada día dividido para los n días.

En la pregunta b) se usa el algoritmo del menor, con la hipótesis que el díamenor es el primero, y que el precio menor es el máximo posible, a fin que se reemplace con el primer menor encontrado.

Se deja la pregunta c) como tarea a fin de que se desarrolle el problema usando un arreglo.

[ algoritmo ] [algoritmo con vector ] [ diagrama flujo ]
..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2008_T3 Simular Precio del Petróleo
# Propuesta: edelros@espol.edu.ec
# Tarea: Realizar el literal c)

import random as rnd

# INGRESO
n = int(input('días del mes: '))

# PROCEDIMIENTO
prcmax = 150
prcmin = 130
rango  = prcmax-prcmin+1
diamenor = 1
pmenor = prcmax

dia = 1
total = 0
while (dia<=n):
    precio = int(rnd.random()*rango)+prcmin
    total  = total+precio

    if (precio<pmenor):
        diamenor = dia
        pmenor   = precio

    dia = dia+1

promedio = total/n

# SALIDA
print('promedio: ')
print(promedio)
print('día de menor precio:')
print(diamenor)

[ algoritmo ] [algoritmo con vector ] [ diagrama flujo ]
..


Algoritmo en Python: usando arreglos

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2008_T3 Simular Precio del Petróleo
# Tema 3. Precio petroleo-Arreglo
# Propuesta: edelros@espol.edu.ec

import random as rnd
import numpy as np

# INGRESO
n = int(input('días del mes: '))

# PROCEDIMIENTO
prcmax = 150
prcmin = 130
rango  = prcmax-prcmin+1
precio = np.zeros((n+1),dtype=int)

# algoritmo del promedio
total = 0
dia   = 1
while (dia<=n):
    precio[dia] = int(rnd.random()*rango)+prcmin
    total = total + precio[dia]
    dia   = dia + 1

promedio = total/n

# algoritmo del menor
diamenor = 1
dia = 1
while (dia<=n):
    if precio[dia]<precio[diamenor]:
        diamenor = dia
    dia = dia + 1

# algoritmo precio superior al promedio
superior = 0
dia = 1
while (dia<=n):
    if precio[dia]>promedio:
        superior = superior + 1
    dia = dia + 1

# SALIDA
print('promedio: ')
print(promedio)
print('día de menor precio:')
print(diamenor)
print('días con precio sobre promedio:')
print(superior)

Resultado del algoritmo

días del mes: 30
promedio: 
140.06666666666666
día de menor precio:
14
días con precio sobre promedio:
16
>>> 

[ algoritmo ] [algoritmo con vector ] [ diagrama flujo ]
..


Diagrama de Flujo

Simular Precio del Petróleo 02 Simular Precio del Petróleo 03

[ algoritmo ] [algoritmo con vector ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_it2008_t3 pdf

ejercicios resueltos Python 1eva_it2008_t3_flujo pdf

ejercicios resueltos Matlab 1eva_it2008_t3 pdf

s1Eva_IT2008_T2 Criba de Eratóstenes con Python

Ejercicio: 1Eva_IT2008_T2 Criba de Eratóstenes

[ algoritmo ] [ diagrama flujo ]

– Se forma un vector con todos los números naturales entre 2 y n.

i 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
criba[i] 1 1 0 1 0 1 0 0 0 1 0 1 0 0 0 1 0 1 0

Llenar un arreglo de marcas o tachado con la hipótesis que todos son primos(1).

# PROCEDIMIENTO
marcado = np.zeros((n+1),dtype=int)
# hipotesis: todos son primos
criba = 2
while (criba<=n):
    marcado[criba] = 1
    criba = criba+1

La prueba de hipótesis consiste en usar un indicador para el número de criba, y otro indicador i para anular marcando con cero (0) las posiciones de los múltiplos.

– Se tachan todos los múltiplos de 2 que son menores que n,

Inicie eliminando los múltiplos de 2, para luego cambiar a los múltiplos de 3, etc.

# no son primos los múltiplos 
criba = 2
while (criba<=n):

    # revisa el primer múltiplo
    i = criba * 2
    while (i<=n):
        marcado[i] = 0
        i = i + criba
    criba = criba+1

Mostrar como resultado solo aquellos números mantienen en marcas válidas (1).

Tarea: Analizar si es necesario hacer funcionar el algoritmo de la prueba de hipótesis hasta n o un número menor. Realizar la validación que n sea mayor que 1.

[ algoritmo ] [ diagrama flujo ]
..


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2008_T2 Criba de Eratóstenes
# Propuesta: edelros@espol.edu.ec

import numpy as np

# INGRESO
n = int(input('primos menores que: '))

# PROCEDIMIENTO
marcado = np.zeros((n+1),dtype=int)

# hipotesis: todos son primos
criba = 2
while (criba<=n):
    marcado[criba] = 1
    criba = criba+1

# no son primos los múltiplos 
criba = 2
while (criba<=n):

    # revisa el primer múltiplo
    i = criba * 2
    while (i<=n):
        marcado[i] = 0
        i = i + criba
    criba = criba+1

# SALIDA
criba = 2
while (criba<=n):
    if marcado[criba]==1:
        print(criba)
    criba = criba+1

resultado del algoritmo

primos menores que: 30
2
3
5
7
11
13
17
19
23
29
>>> 

[ algoritmo ] [ diagrama flujo ]
..


Diagrama de Flujo

diagrama de flujo Criba de Eratóstenes 01

diagrama de flujo Criba de Eratóstenes 02

diagrama de flujo Criba de Eratóstenes 03

[ algoritmo ] [ diagrama flujo ]


Otra forma de plantear el algoritmo

# 1ra Evaluación I Término 2008
# Tema 2. Criba de Eratóstenes
import numpy as np

# INGRESO
n = int(input('cuantos numeros analiza: '))

# PROCEDIMIENTO
# vector de números naturales
natural = np.zeros(n, dtype=int)
posicion =  0
while not(posicion>=n):
    natural[posicion] = posicion
    posicion = posicion +1

# hipotesis todos cumplen
cumple = np.ones(n,dtype = int)

# Tarea: analiza cada posición
posicion = 2
# elimina multiplos / no cumplen
contador = 2
tacha  = posicion *contador
while not(tacha>(n-1)):
    tacha  = posicion *contador
    if tacha<(n-1):
        cumple[tacha] = 0
    contador = contador +1

# SALIDA
# solo valores de la posicion 2 en adelante
print(natural[2:])
print(cumple[2:])

mostrando el siguiente resultado:

cuantos numeros analiza: 50
[ 2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19
 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37
 38 39 40 41 42 43 44 45 46 47 48 49]
[1 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0
 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1 0 1]
>>> 

[ algoritmo ] [ diagrama flujo ]


Propuesta de solución con diagrama de flujo, Python y otra versión con Matlab

ejercicios resueltos Python 1eva_it2008_t2 pdf

ejercicios resueltos Matlab 1eva_it2008_t2 pdf

s1Eva_IT2008_T1 Teorema de Wilson

Ejercicio1Eva_IT2008_T1 Teorema de Wilson

“Un número p es primo si y solo si el factorial (p-1)! + 1 es divisible por p”.

El ejercicio se divide en dos partes principales:
– determinar si un número es primo
– Si es primo, validar lo que indica Wilson

Para la primera parte, se usa el concepto de residuo de la división para determinar si el número es primo.

# revisa esprimo 
esprimo = 1
divisor = 2
while not(divisor>=n or esprimo==0):
    r = n%divisor
    if (r == 0):
        esprimo = 0
    divisor = divisor + 1

La bandera usada es «esprimo» que inicia con el supuesto de ser verdadero ó 1.

Solo si el número resulta ser primo, se aplican las operaciones de Wilson. Primero determinando el valor del factorial,

wilson = -1
if esprimo == 1:
    
    # factorial
    factor = 1
    i = 1
    while not(i>=n):
        factor = factor*i
        i = i + 1

y luego revisar Wilson

    # revisa Wilson 
    residuo = (factor + 1) % n
    if residuo == 0:
        wilson = 1
    else:
        wilson = 0

Se añaden los bloques de ingreso y salida para completar el algoritmo


Algoritmo en Python

# ICM00794-Fundamentos de Computación - FCNM-ESPOL
# 1Eva_IT2008_T1 Teorema de Wilson

# INGRESO
n = int(input('ingrese numero primo: '))
while not(n>0):
    n = int(input('ingrese numero positivo: '))

# PROCEDIMIENTO

# revisa esprimo 
esprimo = 1
divisor = 2
while not(divisor>=n or esprimo==0):
    r = n%divisor
    if (r == 0):
        esprimo = 0
    divisor = divisor + 1

wilson = -1
if esprimo == 1:
    
    # factorial
    factor = 1
    i = 1
    while not(i>=n):
        factor = factor*i
        i = i + 1
    
    # revisa Wilson 
    residuo = (factor + 1) % n
    if residuo == 0:
        wilson = 1
    else:
        wilson = 0

# SALIDA
print('cumple Wilson: ', wilson)

resultado del algoritmo

ingrese numero primo: 7
cumple Wilson:  1
>>> 
== RESTART: D:\Ejemplos\unprograma.py ==
ingrese numero primo: 13
cumple Wilson:  1
>>> 
== RESTART: D:\Ejemplos\unprograma.py ==
ingrese numero primo: 8
cumple Wilson:  -1
>>>