some image

Tag Algoritmia

Obtener la media de un arreglo de numeros

Etiquetas: , Blog, Programación No comments

Este ejemplo pretende mostrar la forma de obtener la media de un arreglo de numeros ingresados por teclado. Se decide utilizar un metodo que reciba un arreglo, porque se pude por ejemplo mostrar los numeros procesados y realizar algún tipo de operación.

Codigo

import java.io.BufferedReader;
import java.io.InputStreamReader;

/**
 * Desarrollar un algoritmo que calcule la media de N números ingresados por
 * teclado
 * 
 * @author codesandtags
 * 
 */
public class MediaNumeros {

	public static void main(String[] args) {

		// Objeto para lectura de datos por teclado
		BufferedReader input = new BufferedReader(new InputStreamReader(
				System.in));
		// Variables de control
		int[] numeros = new int[0];
		int cantidad = 0;

		// Control de la excepcion para que no se ingresen datos no numericos
		try {
			// Solicitud de la cantidad e inicializacion del arreglo
			System.out.print("Ingrese cantidad de numeros a procesar : ");
			cantidad = Integer.parseInt(input.readLine());
			numeros = new int[cantidad];

			// Ingreso de los numeros
			for (int i = 0; i < cantidad; i++) {
				System.out.print("Ingrese numero[" + (i + 1) + "] : ");
				numeros[i] = Integer.parseInt(input.readLine());
			}

		} catch (Exception e) {
			System.err
					.println("\nERROR : El valor ingresado no es un numero entero");
		}

		// Instanciacion y envio de los numeros para obtener la media
		MediaNumeros resultado = new MediaNumeros();
		System.out.println("La media de los numeros es : "
				+ resultado.getMedia(numeros));
	}

	/**
	 * Obtiene la media de un arreglo de numeros ingresados
	 * 
	 * @param numeros
	 * @return
	 */
	public float getMedia(int[] numeros) {
		float media = 0f;
		for (int i = 0; i < numeros.length; i++) {
			media += numeros[i];
		}
		System.out.println("Total numeros : " + numeros.length);
		return (media / numeros.length);
	}

}

Salida

Ingrese cantidad de numeros a procesar : 8
Ingrese numero[1] : 564
Ingrese numero[2] : 1
Ingrese numero[3] : 9
Ingrese numero[4] : 0
Ingrese numero[5] : 657
Ingrese numero[6] : 91
Ingrese numero[7] : 35
Ingrese numero[8] : 99
Total numeros : 8
La media de los numeros es : 182.0

Días de la Semana

Etiquetas: , Blog, Programación No comments

Se desea diseñar un algoritmo que escriba los nombres de los días de la semana en función del valor de una variable DIA introducida por teclado.

Los días de la semana son 7; por consiguiente, el rango de valores de DIA será 1..7, y caso de que DIA tome un valor fuera de este rango se deberá producir un mensaje de error advirtiendo la situación anómala.

Codigo

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class Semana {

    public static void main(String[] args) {
        
        
        //Objeto para lectura de datos por teclado 
        BufferedReader input = new BufferedReader(new InputStreamReader(System.in));
        //Variables
        int dia=1;
        String semana[] = {"Lunes", "Martes", "Miercoles", "Jueves", "Viernes", "Sabado", "Domingo"};
        
        //Control de la excepcion para que no ingrese datos no numericos
        while(dia !=0)
        {
            try{
                //Solicitud de Dia
                System.out.print("DIAS DE LA SEMANA\n"
                        + " 1:  Lunes\n"
                        + " 2:  Marter\n"
                        + " 3:  Miercoles\n"
                        + " 4:  Jueves\n"
                        + " 5:  Viernes\n"
                        + " 6:  Sabado\n"
                        + " 7:  Domingo\n"
                        + " 0:  Termina la ejecucion\n"
                        + " Ingrese numero: ");
                dia = Integer.parseInt(input.readLine());
                if(dia > 0 || dia < 0)
                    System.out.println("\nDía   " + semana[dia-1] + "\n");
                
            }catch(Exception e)
            {
                System.out.println("\nERROR : RANGO DE NUMERO INVALIDO\n ");
            }
        }        
    }
}

Salida

DIAS DE LA SEMANA
 1:  Lunes
 2:  Martes
 3:  Miercoles
 4:  Jueves
 5:  Viernes
 6:  Sabado
 7:  Domingo
 0:  Termina la ejecución
Ingrese numero: 1
Día   Lunes

Ingrese numero: 2
Día   Martes

Ingrese numero: 8
ERROR : RANGO DE NUMERO INVALIDO 

Generando Fibonacci con BigInteger y Suma Digital

Etiquetas: , Blog, Programación No comments

* La serie de fibonacci corresponde a los numeros generados apartir de la adicion de los 2 terminos anteriores, de acuerdo a esto los primeros numeros de fibonacci serian : 1,1,2,3,5,8,13,21,..

* Una suma digital es la representacion de tomar cada uno de los digitos dados en un numero y sumarlos. Ejemplo : la Suma digital de 724 seria igual a 7+2+4 = 13

Bien, de acuerdo a los 2 enunciados anteriores el siguiente codigo pretende mostrar cual es el termino de fibonnaci, que al obtener una suma digital de dicho numero, supere el valor de 100. (Es decir sumando cada digito del numero sea mayor a 100).

import java.math.BigInteger;

/**
 * 
 * La serie de fibonacci corresponde a los numeros generados apartir de la
 * adicion de los 2 terminos anteriores, de acuerdo a esto los primeros numeros
 * de fibonacci serian : 1,1,2,3,5,8,13,21,..
 * 
 * Una suma digital es la representacion de tomar cada uno de los digitos dados
 * en un numero y sumarlos. Ejemplo : la Suma digital de 724 seria igual a :
 * 7+2+4 = 13
 * 
 * @author Codes and Tags
 * 
 */

public class Problem2 {

	public static void main(String[] args) {
		Problem2 solve = new Problem2();
		solve.getFibonnaci(115);
	}

	/**
	 * Obtiene la serie de fibonacci, de la manera mas rudimentaria utilizando
	 * BigInteger apenas para resolver pequenos retos de programacion
	 * 
	 * @param n
	 */
	public void getFibonnaci(int n) {
		// Tiempo inicial del sistema en milisegundos
		long startTime = System.currentTimeMillis();
		// Variables para manejar la serie
		BigInteger a = BigInteger.ONE, b = BigInteger.ONE;
		// Contador para evitar pasarse de calidad 
		int count = 0;

		while (count < n) {
			a = a.add(b);
			b = a.subtract(b);

			if (getDigitalSum(a.toString()) > n) {
				System.out.println("El numero " + a
						+ " genera una suma digital de "
						+ getDigitalSum(a.toString()));
				break;
			}
			count++;
		}
		// Se muestra el tiempo invertido
		long endTime = System.currentTimeMillis();		
		System.out.println("Tiempo ms : " + (endTime - startTime));
	}

	/**
	 * Obtiene la suma digital de un numero dado
	 * 
	 * @param number
	 * @return
	 */
	public int getDigitalSum(String number) {
		System.out.println("number : " + number);
		int sum = 0;
		for (int i = 0; i < number.length(); i++) {
			sum += Integer.parseInt("" + number.charAt(i));
		}
		return sum;
	}

}

La salida del programa seria como esta :

number : 12200160415121876738
number : 19740274219868223167
number : 31940434634990099905
number : 51680708854858323072
number : 83621143489848422977
number : 135301852344706746049
number : 218922995834555169026
number : 354224848179261915075
number : 573147844013817084101
number : 927372692193078999176
number : 927372692193078999176
El numero 927372692193078999176 genera una suma digital de 116
Tiempo ms : 12

Solucionando Problem 7 – Project Euler

Etiquetas: , Blog, Challenges No comments

Para solucionar este problema, recurrí a una solución algo simple teniendo en cuenta los métodos ya implementados por la clase BigInteger, llamando puntualmente al metodo nextProbablePrime() e iterando hasta llegar a la posición del número primo requerido. :)

Problema

 By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see
 that the 6th prime is 13.
  
 What is the 10 001st prime number?

Solución

import java.math.BigInteger;

/**
 * By listing the first six prime numbers: 2, 3, 5, 7, 11, and 13, we can see
 * that the 6th prime is 13.
 * 
 * What is the 10 001st prime number?
 * 
 * @author codesandtags
 * 
 */
public class Problem7 {

	public static void main(String[] args) {
		Problem7 solve = new Problem7();
		System.out.println("The 10001st prime number is : "
				+ solve.getPrimeNumber(6));
		System.out.println("The 10001st prime number is : "
				+ solve.getPrimeNumber(10001));
	}

	/**
	 * Obtiene un numero primo dado
	 * 
	 * @param n
	 * @return
	 */
	public BigInteger getPrimeNumber(int n) {
		// Inicializa el primer numero primo
		BigInteger prime = BigInteger.ZERO;
		// Itera hasta llegar a N primos
		for (int i = 0; i < n; i++) {
			prime = prime.nextProbablePrime();
		}
		// Hakuna Matata
		return prime;
	}
}

Hakuna Matata

Solucionando Problem 6 – Project Euler

Etiquetas: , Blog, Challenges No comments

Este problema consistia en hallar la diferencia entre la suma de los primeros X cuadrados y el cuadrado de la suma de los primeros X numeros :).

Problema

 The sum of the squares of the first ten natural numbers is,
 
 12 + 22 + ... + 102 = 385 The square of the sum of the first ten natural
 numbers is,
  
 (1 + 2 + ... + 10)2 = 552 = 3025 Hence the difference between the sum of the
 squares of the first ten natural numbers and the square of the sum is 3025
 385 = 2640.
  
 Find the difference between the sum of the squares of the first one hundred
 natural numbers and the square of the sum.

Solución

/**
 * The sum of the squares of the first ten natural numbers is,
 * 
 * 12 + 22 + ... + 102 = 385 The square of the sum of the first ten natural
 * numbers is,
 * 
 * (1 + 2 + ... + 10)2 = 552 = 3025 Hence the difference between the sum of the
 * squares of the first ten natural numbers and the square of the sum is 3025
 * 385 = 2640.
 * 
 * Find the difference between the sum of the squares of the first one hundred
 * natural numbers and the square of the sum.
 * 
 * @author codesandtags
 * 
 */
public class Problem6 {

	public static void main(String[] args) {

		Problem6 solve = new Problem6();
		System.out.println("The sum of the squares is : "
				+ solve.differenceSumSquares(10));
		System.out.println("The sum of the squares is : "
				+ solve.differenceSumSquares(100));

	}

	/**
	 * Obtiene la diferencia entre el cuadrado de los primeros X numeros y de
	 * cada uno de los primeros X numeros dados
	 * 
	 * @param square
	 * @return
	 */
	public long differenceSumSquares(int square) {
		// Variables
		long sumSquares = 0;
		long sumNumbers = 0;
		long difference = 0;

		// Itera para hallar la suma de los cuadrados y los numeros
		for (int i = 1; i <= square; i++) {
			sumSquares += (long) Math.pow(i, 2);
			sumNumbers += i;
		}
		// Se obtiene la diferencia
		difference = (long) (Math.pow(sumNumbers, 2) - sumSquares);
		return difference;
	}
}

Hakuna Matata