所以我编写了一个代码,用于在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();
}
}
}
答案 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
,我认为它可以解决此问题。