寻找数字最大因素的代码

时间:2015-07-28 19:29:39

标签: c#

我正在提高我的C#技能,现在我正在编写代码以找到最大的数字因素。但是,它不显示任何内容

static void Main(string[] args)
{
    Int64 a = 600851475143;
    List<Int64> dividers = new List<Int64>();
    for (Int64 b = 2; b < a; b++)
    {
        if (a % b == 0)
        {
            dividers.Add(b);
        }
    }
    Int64 max = dividers.Max();
    Console.WriteLine(max);
    Console.ReadLine();
}

2 个答案:

答案 0 :(得分:0)

您的程序运行正常 - 只需要真正长时间执行。你需要找到一种更有效的方法。

你可以使用的一个技巧是只考虑平方根 - 因子总是成对出现。

Int64 a = 600851475143;
List<Int64> dividers = new List<Int64>();
for (Int64 b = 2; b <= Math.Sqrt(a); b++)
{
    if (a % b == 0)
    {
        dividers.Add(b);
        dividers.Add(a / b);
    }
}
Int64 max = dividers.Max();

你可以进一步改善这一点 - 你可以代替保留所有因素的清单,只记录到目前为止看到的最大因素。

答案 1 :(得分:0)

现在知道你正试图解决Euler Problem 3我不会直接回答。

解决此问题时需要考虑的事项:

## 1 ## 您只需要检查该数字的sqrt()。

double limit = Math.Sqrt(number);
for (int i = 2; i <= limit; i++) 

## 2 ## IsPrime功能

public static bool IsPrime(long number)
{
    if ((number & 1) == 0)
    {
        return number == 2;
    }

    double limit = Math.Sqrt(number);
    for (int i = 3; i <= limit; i += 2)
    {
        if ((number % i) == 0)
        {
            return false;
        }
    }

    return number != 1;
}

## 3 ## 当您找到因子(a % b == 0)时,检查b或(a / b)是否为素数并保持最大值超过当前已知的最大素因子