有效地找到数字的所有约数
所以我只想找到给定数字的所有约数(除了数字本身)。 目前,我有这个:
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;
}
Any 。关于如何修复第一个,或者如何从第二个创建组合列表的想法(我更喜欢这样做,因为它会更快)?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
由于您已经有了质因数列表,因此您要做的就是计算该列表的幂集。
现在,一个问题是列表中可能有重复项(例如 20 = 2 * 2 * 5 的质因数),但集合不允许重复项。因此,我们可以通过将列表中的每个元素投影到 {x, y} 形式的结构来使其唯一,其中 x 是素数,y 是列表中素数的索引。
现在,
all_primes
是一个 {x, y} 形式的列表,其中 x 是素数,y 是列表中的索引。然后我们计算幂集(下面
GetPowerSet
的定义):因此,
power_set_primes
是一个IEnumerable>
,其中>T
是匿名类型{x, y}
,其中 x 和 y 的类型为int
。接下来,我们计算幂集中每个元素的乘积
将它们放在一起:
来自 http://rosettacode。 org/wiki/Power_Set 用于 powerset 的实现。
Since you already have a list of the prime factors, what you want to do is to compute the powerset of that list.
Now, one problem is that you might have duplicates in the list (e.g. the prime factors of 20 = 2 * 2 * 5), but sets don't allow duplicates. So, we can make each element of the list unique by projecting it to a structure of the form {x, y} where x is the prime and y is the index of the prime in the list.
Now,
all_primes
is a list of the form {x, y} where x is the prime and y is the index in the list.Then we compute the power set (definition of
GetPowerSet
below):Hence,
power_set_primes
is anIEnumerable<IEnumerable<T>>
whereT
is the anonymous type{x, y}
where x and y are of typeint
.Next, we compute the product of the each element in the power set
Putting it all together:
From http://rosettacode.org/wiki/Power_Set for implementations of powerset.
之前有过类似的问题< /a>,它有一个使用 IEnumerable 的有趣解决方案。如果您想要所有除数而不是因子,并且假设您至少使用 C# 3.0,您可以使用类似这样的内容:
然后像这样使用它:
或者,如果您想要一个列表,只需:
There has been a similar question before, which has an interesting solution using IEnumerable. If you want all the divisors and not the factors, and assuming you are using at least C# 3.0 you could use something like this:
and then use it like this:
or, if you want a List, just: