【发布时间】:2011-02-08 17:50:30
【问题描述】:
作为编程挑战的一部分,我用 C# 编写了一个程序来查找一定范围内的完美数字。但是,我意识到计算超过 10000 的完美数字时非常慢。是否有任何优化方法可以找到完美数字?我的代码如下:
using System;
using System.Collections.Generic;
using System.Linq;
namespace ConsoleTest
{
class Program
{
public static List<int> FindDivisors(int inputNo)
{
List<int> Divisors = new List<int>();
for (int i = 1; i<inputNo; i++)
{
if (inputNo%i==0)
Divisors.Add(i);
}
return Divisors;
}
public static void Main(string[] args)
{
const int limit = 100000;
List<int> PerfectNumbers = new List<int>();
List<int> Divisors=new List<int>();
for (int i=1; i<limit; i++)
{
Divisors = FindDivisors(i);
if (i==Divisors.Sum())
PerfectNumbers.Add(i);
}
Console.Write("Output =");
for (int i=0; i<PerfectNumbers.Count; i++)
{
Console.Write(" {0} ",PerfectNumbers[i]);
}
Console.Write("\n\n\nPress any key to continue . . . ");
Console.ReadKey(true);
}
}
}
【问题讨论】:
-
计算完美数就像计算每周有多少天。结果永远不会改变,所以不要计算它们。查找它们。
-
@ Daniel Dyson - 发帖者表示这是某种编程挑战,我怀疑他会对一系列预先计算的答案感到满意 =)
-
@ paradox - 你还有另一个问题,因为完美数是如此稀疏,如果你的程序认真搜索完美数,你很快就会打破你的 int 限制。
-
@乔尔·古德温。这是一个公平的观点,但如果我向我的团队中的一个人提出这样的挑战,我希望他们能给出答案,即这些应该被存储而不是计算。毕竟,按照我的阅读方式,挑战是“找到完美的数字”,而不一定是“计算”它们。如果它们都已经在那个范围内计算过了,为什么还要再计算呢?编程就是想出最好的解决方案。这并不总是一种算法。
-
@Daniel Dyson。如果我在现实世界的问题中需要它们,肯定会存储解决方案 - 但对我来说,这个问题的精神是“你如何优化这个算法?”然而,寻找它是一件令人讨厌的事情,因为它们分布得如此之薄,即使与素数相比也是如此。
标签: c# optimization number-theory perfect-numbers