找到最大素数因子的程序

时间:2017-11-16 17:52:20

标签: c# math prime-factoring

所以我编写了一个代码,用于在Project Euler上找到我学习过程的最大因素,并且它运行良好,我得到了正确的答案。我看到了不同的解决方案,它们“更长”,看起来更复杂。所以我的问题是,有什么我的代码没有照顾,让我们说不同的数字或有更好的方法来完成这项任务?我正在尝试学习解决问题的不同方法以便更好地编程,所以我想知道我是否应该以不同的方式完成该代码。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace prime_factor
{
  class Program
  {
    static void Main(string[] args)
    {
        long n = 600851475143;
        int largest = 0;
        for (int i = 1; i<=n; i++)
        {
            if (n%i == 0)
            {
                Console.WriteLine(i);
                n /= i;
                largest = i;

            }
        }
        Console.WriteLine(largest);
        Console.ReadLine();
    }
  }
}

2 个答案:

答案 0 :(得分:2)

如果每次找到因子时将 n 除以 f ,您将自动找到素因子。这里的伪代码可以翻译成您喜欢的语言:

function factors(n)
    f := 2; fs := []
    while f * f <= n
        if n % f == 0
            fs := fs ++ f
            n := n / f
        else
            f := f + 1
    fs := fs ++ n
    return fs

此处 fs 是因子的链接列表,++是list-append操作。您可以看到Python实现here

有更好的方法可以找到因子,但这对于您尝试解决的 Project Euler 问题已经足够了。如果您对素数编程感兴趣,可以在我的博客上享受this essay

答案 1 :(得分:1)

我喜欢它 - 你可以检查i是否为素数,这是最复杂的部分!如果它不是素数,你就已经把它的复合因子分开了。

但是,我认为有些情况下非素数i可以潜入 - 其中多个素数因子会划分你的n。试试n = 36(因为36 == 2 ^ 2 * 3 ^ 2)。我认为你的算法返回6。

您只需添加一个循环,看看i是否可以多次划分n,我认为它可以解决此问题。