Así que simplemente quiero encontrar todos los divisores de un número dado (excepto el número en sí). Actualmente, tengo esto:Encontrando de manera eficiente todos los divisores de un número
public static List<int> proper_divisors(int x)
{
List<int> toreturn = new List<int>();
toreturn.Add(1);
int i = 0;
int j=1;
int z = 0;
while (primes.ElementAt(i) < Math.Sqrt(x))
{
if (x % primes.ElementAt(i) == 0)
{
toreturn.Add(primes.ElementAt(i));
toreturn.Add(x/primes.ElementAt(i));
j = 2;
z = (int)Math.Pow(primes.ElementAt(i), 2);
while (z < x)
{
if (x % z == 0)
{
toreturn.Add(z);
toreturn.Add(x/z);
j++;
z = (int)Math.Pow(primes.ElementAt(i), j);
}
else
{
z = x;
}
}
}
i++;
}
toreturn = toreturn.Distinct().ToList<int>();
return toreturn;
}
donde los números primos es una lista de los números primos (asuma que es correcto, y es lo suficientemente grande). El algoritmo funciona en el sentido de que encuentra todos los factores primos, pero no todos los factores (es decir, dado 34534, devuelve {1,2,17267,31,1114} pero falla {62, 557} ya que 62 es una combinación , y por lo tanto pierde 557 también.
tengo también intentó conseguir justo los factores primos de un número, pero no sé cómo convertir esto en una lista de todas las combinaciones correctas.
El código para que el algoritmo es el siguiente:
public static List<int> prime_factors(int x)
{
List<int> toreturn = new List<int>();
int i = 0;
while (primes.ElementAt(i) <= x)
{
if (x % primes.ElementAt(i) == 0)
{
toreturn.Add(primes.ElementAt(i));
x = x/primes.ElementAt(i);
}
else
{
i++;
}
}
return toreturn;
}
¿Alguna idea sobre cómo solucionar el primero de ellos, o cómo crear la lista de combinaciones de la segunda d uno (lo preferiría porque sería más rápido)?
duplicado posible de [Mejor forma de encontrar todos los factores de un número dado en C#] (http://stackoverflow.com/questions/239865/best-way-to-find-all-factors-of-a-given-number-in-c-sharp) – MxNx