Esta forma es mas eficiente ya que solo calcula los factoriales 10 veces,
faltaria implementar factorial de manera no recursiva...
Tambien le falta agragar un poco de elegancia al codigo, no me gusta tanto el hecho de que Program.Fact sea static, deberia inclurilo dentro de una clase curious como el codigo anterior, pero eso ya no lo hago yo
El codigo esta en c#:
Reto 3:
El usuario proporcionara un numero de pruebas p, y un numero de intervalos n
El programa debera generar p numeros aleatorios entre 1 y q (tal que q sea el menor numero divisible por n, pero mayor o igual a 100), y elaborar un reporte sobre que porcentaje de los numeros cayo en cada intervalo.
Si por ejemplo el numero de intervalos n es 4, se consideraran los intervalos 1-25, 26-50, 51-75 y 75-100.
No se si me deje entender, si no lo hice avisenme...
faltaria implementar factorial de manera no recursiva...
Tambien le falta agragar un poco de elegancia al codigo, no me gusta tanto el hecho de que Program.Fact sea static, deberia inclurilo dentro de una clase curious como el codigo anterior, pero eso ya no lo hago yo
El codigo esta en c#:
Código (csharp) [Seleccionar]
using System;
namespace Problema2Mejorado
{
class Program
{
static Factorial fact = new Factorial(10);
static void Main(string[] args)
{
int inicio, final;
Console.WriteLine("Introduzca el primer numero del intervalo");
inicio = int.Parse(Console.ReadLine());
Console.WriteLine("Introduzca el ultimo numero del intervalo");
final = int.Parse(Console.ReadLine());
for (int probar = inicio; probar <= final; probar++)
{
if (EsCurioso(probar))
Console.WriteLine("{0}, ", probar);
}
Console.ReadKey();
}
//Para omitir conversiones inutiles recibo el numero como string ya q necesito analizar sus digitos
static bool EsCurioso(int Numero)
{
string Num = Numero.ToString();
int sumador = 0;
foreach (char digito in Num)
{
//Con esto me ahorro todo el switch case del otro codigo :p
int ValorDigito = int.Parse(digito.ToString());
sumador += fact[ValorDigito];
}
if (sumador == int.Parse(Num))
return true;
else
return false;
}
}
class Factorial
{
//En este arreglo guardaremos los factoriales de 0 hasta 9, para q solo tengan q ser calculados una vez :)
private int[] factoriales;
public Factorial(int rango)
{
factoriales = new int[rango];
for (int i = 0; i < rango; i++)
{
factoriales[i] = CalcularFactorial(i);
}
}
int CalcularFactorial(int n)
{
if (n <= 1)
return 1;
else
return n * CalcularFactorial(n - 1);
}
//Y de manera muy limpia obtenemos el factorial de un numero con el operador []
public int this[int i]
{
get
{
return factoriales[i];
}
}
}
}
Reto 3:
El usuario proporcionara un numero de pruebas p, y un numero de intervalos n
El programa debera generar p numeros aleatorios entre 1 y q (tal que q sea el menor numero divisible por n, pero mayor o igual a 100), y elaborar un reporte sobre que porcentaje de los numeros cayo en cada intervalo.
Si por ejemplo el numero de intervalos n es 4, se consideraran los intervalos 1-25, 26-50, 51-75 y 75-100.
No se si me deje entender, si no lo hice avisenme...