我想找到给定数的所有因数(除了这个数本身)。
目前我有以下代码:
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;
}
假设primes是一个质数列表(假定它是正确的,并且足够大)。 该算法能够找到所有的质因子,但不是所有的因子(即对于给定的数字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;
}
任何想法如何修复第一个问题,或者如何从第二个问题中创建组合列表(我更喜欢这样做,因为它会更快)?