Итак, я просто хочу найти все делители данного числа (кроме самого числа). В настоящее время у меня есть это:
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;
}
, где простые числа - это список простых чисел (предположим, что он правильный и достаточно большой). Алгоритм работает в том смысле, что он находит все простые множители, но не все множители (т. Е. Для 34534 он возвращает {1,2,17267,31,1114}, но пропускает {62, 557}, поскольку 62 является комбинацией, и поэтому также пропущено 557.
Я также пробовал просто получить простые множители числа, но я не знаю, как преобразовать это в список всех правильных комбинаций.
Код для этого алгоритм выглядит следующим образом:
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;
}
Есть идеи, как исправить первое или как создать список комбинаций из второго (я бы предпочел, чтобы это было быстрее)?