【问题标题】:C# largest prime factor with modulo?C#带模的最大素数?
【发布时间】:2011-05-06 09:03:33
【问题描述】:

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

【问题讨论】:

  • 这段代码什么也不做。它将在第一次迭代期间中断。 for 中的条件也是错误的。
  • en.wikipedia.org/wiki/Prime_number Sieve 可能是最简单的方法。做某种循环会花费太长时间。您基本上创建了一个列表并开始摆脱直到 sqrt(值)的下一个最小整数的所有倍数。所以,你从@ 2 开始,去掉所有能被 2 整除的东西,然后转到下一个数字 3。去掉所有能被 3 整除的数字,然后是 5,因为 4 从 2 中删除,等等。 .

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


【解决方案1】:

如果我要使用循环和模数来做到这一点,我会这样做:

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 的幂

【讨论】:

    【解决方案2】:

    哦,这听起来像是迭代器块的有趣用途。不过,不要把它交给你的教授:

    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();
    }
    

    【讨论】:

    • 如果你的 n 大于 2*10^9 会导致堆栈溢出
    • 谢谢你,我只是为了好玩,不是教授! :)
    • 嗯,是的,大约 20 亿是 int.MaxValue。
    • 好点,例如我看到的这个问题中最常见的是 Project Euler,它是 600b,2*10^9 是 200b。虽然非常优雅的程序。对语言有很好的理解。
    【解决方案3】:

    我不太确定您的问题是什么:也许您需要对数字进行循环?但是,您的代码有两个明显的问题:

    • 您的 for 循环具有相同的停止值和结束值。即它只会运行一次且仅一次

    • 在最大 PrimeFactor 总和之前有一个休息时间。这个总和将永远不会执行,因为 break 将停止 for 循环(并因此停止执行该块)。编译器应该给出一个警告,指出这个总和是不可达的。

    【讨论】:

    • 我看到你已经修复了中断顺序。它仍然在一个 if true 语句中,因此它将中断执行循环(无论如何只有一次迭代)
    • 好吧,我试图找出如何通过使用模数来找到一个数的最大素数。如果它甚至可能,如果可以,怎么做。而 true 只是一个占位符,一旦我可以找出是否可以使用模数的条件。
    • 首先让一个简单的素数测试器工作。然后您可能想添加一个缓存机制 - 例如。一组结果(未经测试、素数、非素数)。然后添加一个循环,从 N 的一半开始倒数到 2。当找到一个素因子时循环停止。
    猜你喜欢
    • 2013-10-05
    • 2021-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多