C# 查找最大素因子的程序

C# 查找最大素因子的程序,c#,math,prime-factoring,C#,Math,Prime Factoring,所以我写了一个代码,为我在Euler项目上的学习过程寻找最大的因素,它工作得很好,我得到了正确的答案。虽然我看到了不同的解决方案,但它们“更长”,看起来更复杂。所以我的问题是,对于不同的数字,我的代码是否有什么不需要考虑的,或者有没有更好的方法来完成这个任务?我正在尝试学习解决问题的不同方法,以便更好地编程,所以我想知道我是否应该以不同的方式编写代码 using System; using System.Collections.Generic; using System.Linq; using

所以我写了一个代码,为我在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();
    }
  }
}
使用系统;
使用System.Collections.Generic;
使用System.Linq;
使用系统文本;
使用System.Threading.Tasks;
名称空间素数
{
班级计划
{
静态void Main(字符串[]参数)
{
长n=600851475143;
int最大=0;

对于(inti=1;i我喜欢它-你可以检查
i
是否为素数,这是最复杂的部分!如果它不是素数,你就已经划分出它的合成因子了

然而,我认为有些情况下非素数
I
可以潜入-素数因子的倍数除以你的
n
。试试
n=36
(因为36==2^2*3^2)。我认为你的算法返回6


你只需要添加一个循环,看看
i
是否可以将
n
分割多次,我想它会解决这个问题。

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

然而,我认为有些情况下非素数
I
可以潜入-素数因子的倍数除以你的
n
。试试
n=36
(因为36==2^2*3^2)。我认为你的算法返回6

你只需要添加一个循环,看看
i
是否可以多次除以
n
,我想它会解决这个问题。

如果你每次找到一个因子都将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
功能因子(n)
f:=2;fs:=[]
而f*f如果每次查找因子时都将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
功能因子(n)
f:=2;fs:=[]


如果你试着用8,你会得到4,不是吗?你的程序不会返回素数因子。哦,是的。你是对的。它正在寻找最大的素数,但它没有给我它应该给的素数。我想我更多地关注主题而不是整个程序的要点。所以它解决了问题,但没有正确地写出所有素数我认为你只能迭代到sqrt(n)检查这两个因素我认为问题是你增加i,即使它是一个因素。你应该给i的每个值一个除法的机会,直到它失败。也就是说,将if改为while。对于其他更复杂的解决方案,不要担心!如果你得到正确的答案,这意味着你找到了一个更简单的解决方案。谢谢!我找到了一个解决方案n我想。如果(n%I==0)有一段时间(n%I==0),我就改变了所以基本上它现在给了每个i一个机会,直到它失败。我在这里吗?我现在对8和36这样的数字有了正确的答案。如果你尝试用8,你会得到4,不是吗?你的程序不会返回素数因子。哦,是的。你是对的。它正在寻找最大的素数,但它没有给我应有的素数。我想我集中注意力了所以它解决了这个问题,但是没有正确地写出所有的素数。我想你只能迭代到sqrt(n)检查这两个因素我认为问题是你增加i,即使它是一个因素。你应该给i的每个值一个除法的机会,直到它失败。也就是说,将if改为while。对于其他更复杂的解决方案,不要担心!如果你得到正确的答案,这意味着你找到了一个更简单的解决方案。谢谢!我找到了一个解决方案n我想。如果(n%I==0)有一段时间(n%I==0),我就改变了所以基本上它现在给了每个i一个机会,直到它失败。我在这里吗?我现在得到了一个关于8和36这样的数字的正确答案。谢谢你的答案!我想我解决了这个问题。所以我做了什么,我改变了我的if语句,所以它将检查这个语句,只要它可以被除。现在它对36有效。你认为有问题吗还有问题吗?而(n%i==0){Console.WriteLine(i);n/=i;最大值=i;}我认为这会起作用-即使你没有检查
I
是否为素数,你已经尝试将
n
除以所有较低的整数。这也是非常有效的,因为你一直在降低
n
,我想你偶然发现了一个非常好的算法!哇,非常感谢!这对我来说意义重大,因为我刚刚开始g编程更多。我想更好地理解作为程序员的员工,能够像你帮助我一样编写代码和帮助他人!谢谢!我做到了!但这并没有表现出来,因为我没有超过15岁的声誉。谢谢你的回答!我想我已经解决了这个问题。所以我做了什么,我暂时更改了if语句,所以它会检查这个语句因为可以分割。现在它对36有效。你认为还有其他问题吗?而(n%i==0){