我想知道是否有可能通过在C#中使用模数来找到数字的最大素数因子。换句话说,如果i % x == 0
,那么我们可以打破for
循环或类似的循环,其中x
等于低于i
值的所有自然数。
我如何指定all natural numbers below our i value
等于我们的x变量?如果你知道我在说什么,写出每个整数的条件变得有点乏味。
顺便说一下,我确信在C#中有一个远更容易的方法,所以如果你有想法请告诉我,但我也想尝试以这种方式解决它,只是为了看看我是否可以用我的初学者知识来做到这一点。
如果您想查看我目前所拥有的内容,以下是我当前的代码:
static void Main()
{
int largestPrimeFactor = 0;
for (long i = 98739853; i <= 98739853; i--)
{
if (true)
{
largestPrimeFactor += (int) i;
break;
}
}
Console.WriteLine(largestPrimeFactor);
Console.ReadLine();
}
答案 0 :(得分:6)
如果我使用循环和模数这样做,我会这样做:
long number = 98739853;
long biggestdiv = number;
while(number%2==0) //get rid of even numbers
number/=2;
long divisor = 3;
if(number!=1)
while(divisor!=number)
{
while(number%divisor==0)
{
number/=divisor;
biggestdiv = divisor;
}
divisor+=2;
}
最后,biggestdiv
将是最大的主要因素。
注意:此代码直接在浏览器中编写。我没有尝试编译或运行它。这仅用于展示我的概念。可能存在算法错误。他们是,让我知道。我知道它根本没有优化(我认为Sieve是最好的)。
修改强>
修复:当number
为素数时,前一代码将返回1
已修复:之前的代码将以循环结束,导致divisor
溢出,其中number
为2的幂
答案 1 :(得分:3)
哦,这对于迭代器块来说听起来很有趣。不过,请不要将其转交给您的教授:
private static List<int> primes = new List<int>() {2};
public static IEnumerable<int> Primes()
{
int p;
foreach(int i in primes) {p = i; yield return p;}
while (p < int.MaxValue)
{
p++;
if (!primes.Any(i => p % i ==0))
{
primes.Add(p);
yield return p;
}
}
}
public int LargestPrimeFactor(int n)
{
return Primes.TakeWhile(p => p <= Math.Sqrt(n)).Where(p => n % p == 0).Last();
}
答案 2 :(得分:1)
我不确定你的问题是什么:也许你需要循环数字?但是,您的代码有两个明显的问题:
您的for循环具有相同的停止和结束值。即它将只运行一次
您在maximumPrimeFactor总和之前休息一下。这个总和将永远不会执行,因为break将停止for循环(因此执行该块)。编译器应该发出警告,说明此总和无法访问。