C# 选中以添加-上面的将添加2两次:)Math.Sqrt返回一个double。此外,还需要对这一点进行汇总。试着以20为例,你可以重新构造循环,而不是平方根(int factor=1;factor*factor True-我可以想象,如果超过某个点,性能会因此
C# 选中以添加-上面的将添加2两次:)Math.Sqrt返回一个double。此外,还需要对这一点进行汇总。试着以20为例,你可以重新构造循环,而不是平方根(int factor=1;factor*factor True-我可以想象,如果超过某个点,性能会因此,c#,.net,math,C#,.net,Math,选中以添加-上面的将添加2两次:)Math.Sqrt返回一个double。此外,还需要对这一点进行汇总。试着以20为例,你可以重新构造循环,而不是平方根(int factor=1;factor*factor True-我可以想象,如果超过某个点,性能会因此而降低,因为您在每个循环上计算它?它可能没有循环的其他部分那么重要。我想,必须执行基准测试。酷主意标记。当您你正在让步。你知道,我希望,他的问题还没有一个通用的高性能解决方案。现代密码学依赖于没有这样的解决方案。是的,但我不确定是否有比简单地逐
选中以添加-上面的将添加2两次:)Math.Sqrt返回一个double。此外,还需要对这一点进行汇总。试着以20为例,你可以重新构造循环,而不是平方根(int factor=1;factor*factor True-我可以想象,如果超过某个点,性能会因此而降低,因为您在每个循环上计算它?它可能没有循环的其他部分那么重要。我想,必须执行基准测试。酷主意标记。当您你正在让步。你知道,我希望,他的问题还没有一个通用的高性能解决方案。现代密码学依赖于没有这样的解决方案。是的,但我不确定是否有比简单地逐个测试数字更好的方法,因为我已经有一段时间没上数学课了简单的winform应用程序可能会有所帮助,因为它们是两个不同的答案,具有不同的优点。需要在for循环后添加以下内容以返回x本身。数字本身总是一个因素。
产生返回x;
我认为以前可能出错的内容现在都是正确的。它停止在平方根处的原因是因为我t已经经历了平方根以下的可能因素(需要乘以“max”以上的任何数字),以及平方根以上的任何数字(因为它输出自身和乘以的数字以获得结果)。在每次循环迭代中输出对的两侧时,尚未输出的最大可能值是平方根。例如,如果您得到的因子为81,则10到40之间的循环迭代是浪费的。当您输出3时,您已经输出27,如果您没有输出两侧,您将永远不会得到81作为因子if您在81/2(40)停车。干杯!现在确实有道理了。我会缓存x/I
而不是计算两次,因为这只能处理整数限制以内的因子。@spencer很好奇为什么在foreach循环中使用收益率返回,因为您已经有了IEnumerable,为什么不直接返回Linq查询的结果而不是将其分配给searched?%
实际上是“余数”,而不是“余数”。IEnumerable
块有一个上限,这使得分解“小”(计算)数很实用。@SamuelJackson:C#5语言规范第5.8.3节不同意。您的MSDN引用是JScript,而不是C。@SamuelJackson:(鉴于MSDN页面讨论的是“模,或余数,运算符”,它看起来有点破绽,好像它认为这两个运算符是等价的……)参见-在乘法运算符一节中,它被命名为“模”,在赋值运算符和Lambda运算符下,它指出“模数分配。将x的值除以y的值,将余数存储在x中,然后返回新值。”虽然从技术上讲,模数计算是除数所有可能的除法之后剩下的内容,但此操作(在c#文档中)的正确数学术语是模数
,有些人将其称为:。)虽然可以使用“余数”一词,但运算符是“模数”,计算结果是所有除法作为整数完成后的余数。技术性很小,但并不少见(正如您从MicrosoftSFT的一些文档中看到的)即使是那些善于混淆术语的人,也会混淆计算结果和运算符本身。我建议提供更多描述性变量名,以进一步增强可读性。
static IEnumerable<int> GetFactors2(int n)
{
return from a in Enumerable.Range(1, n)
where n % a == 0
select a;
}
private IEnumerable<int> GetFactors3(int x)
{
for (int factor = 1; factor * factor <= x; factor++)
{
if (x % factor == 0)
{
yield return factor;
if (factor * factor != x)
yield return x / factor;
}
}
}
private IEnumerable<int> GetFactors1(int x)
{
int max = (int)Math.Ceiling(Math.Sqrt(x));
for (int factor = 1; factor < max; factor++)
{
if(x % factor == 0)
{
yield return factor;
if(factor != max)
yield return x / factor;
}
}
}
public List<int> Factor(int number)
{
var factors = new List<int>();
int max = (int)Math.Sqrt(number); // Round down
for (int factor = 1; factor <= max; ++factor) // Test from 1 to the square root, or the int below it, inclusive.
{
if (number % factor == 0)
{
factors.Add(factor);
if (factor != number/factor) // Don't add the square root twice! Thanks Jon
factors.Add(number/factor);
}
}
return factors;
}
IEnumerable<int> GetFactors(int n)
{
Debug.Assert(n >= 1);
return from i in Enumerable.Range(1, n)
where n % i == 0
select i;
}
public static bool Divides(this int potentialFactor, int i)
{
return i % potentialFactor == 0;
}
public static IEnumerable<int> Factors(this int i)
{
return from potentialFactor in Enumerable.Range(1, i)
where potentialFactor.Divides(i)
select potentialFactor;
}
foreach (int i in 4.Factors())
{
Console.WriteLine(i);
}
public static bool Divides(this int potentialFactor, int i)
{
return i % potentialFactor == 0;
}
public static IEnumerable<int> Factors(this int i)
{
foreach (int result in from potentialFactor in Enumerable.Range(1, (int)Math.Sqrt(i))
where potentialFactor.Divides(i)
select potentialFactor)
{
yield return result;
if (i / result != result)
{
yield return i / result;
}
}
}
static IEnumerable<int> GetFactors(int n)
{
Debug.Assert(n >= 1);
var pairList = from i in Enumerable.Range(1, (int)(Math.Round(Math.Sqrt(n) + 1)))
where n % i == 0
select new { A = i, B = n / i };
foreach(var pair in pairList)
{
yield return pair.A;
yield return pair.B;
}
}
public static IEnumerable<uint> GetFactors(uint x)
{
for (uint i = 1; i * i <= x; i++)
{
if (x % i == 0)
{
yield return i;
if (i != x / i)
yield return x / i;
}
}
}
public static IEnumerable<int> GetDivisors(int number)
{
var searched = Enumerable.Range(1, number)
.Where((x) => number % x == 0)
.Select(x => number / x);
foreach (var s in searched)
yield return s;
}
List<int> GetFactors(int n)
{
var f = new List<int>() { 1 }; // adding trivial factor, optional
int m = n;
int i = 2;
while (m > 1)
{
if (m % i == 0)
{
f.Add(i);
m /= i;
}
else i++;
}
// f.Add(n); // adding trivial factor, optional
return f;
}
function getFactors(num1){
var factors = [];
var divider = 2;
while(num1 != 1){
if(num1 % divider == 0){
num1 = num1 / divider;
factors.push(divider);
}
else{
divider++;
}
}
console.log(factors);
return factors;
}
getFactors(20);