C#模数最大的素数因子?

时间:2010-11-07 19:23:00

标签: c# for-loop if-statement prime-factoring

我想知道是否有可能通过在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();
}

3 个答案:

答案 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循环(因此执行该块)。编译器应该发出警告,说明此总和无法访问。