我正在提高我的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();
}
答案 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)是否为素数并保持最大值超过当前已知的最大素因子