素数c#

时间:2011-09-21 15:47:13

标签: c# .net algorithm primes

很抱歉,我不得不问一个非常简单的问题。 我的问题是我想生成素数直到最大数。

这是我的代码:

    for (int i = 2; i <= max - 1; i++)
        {
            System.Threading.Thread.Sleep(1000);
            if (Progress != null)
            {
                if (max%i == 0)
                    Console.WriteLine(i);
            }
        }  

我的代码不起作用,我不知道为什么......

你能帮帮我吗?

4 个答案:

答案 0 :(得分:8)

提示1:算法优化

您无需一直到最大号码。你只需要去它的平方根。

与我一起考虑这个例子:如果100除以50,它首先被捕获为除以2.所以你只需要达到10,你找到的任何除数,它的对应物就会被找到之前。

但这只是你如何最佳地找出特定数字是否为素数。

提示2:IsNumberPrime()方法

首先,您必须有一种方法来确定特定数字是否为素数。请记住这里的提示1。

提示3:这次正确行事

按照提示1和2后,现在可以循环并确定最低素数低于最大数量。

结论

对不起,这里没有代码,只是一般方向。为你做功课对你没有帮助。这个答案会。

答案 1 :(得分:2)

虽然你可以检查每个数字的素数,但这是浪费工作。有许多数字你甚至不必考虑。偶数除了2,一个。还有更多技巧,例如6倍的倍数(google it)

如果要生成素数,请使用生成素数的算法。似乎很明显,对吧?但是,测试素性的算法不属于该类别。 Eratosthenes的Sieve很好,Atkin的筛子更好。

如果你要检查数字的素数(但严重的话,不要),试验除法是最糟糕的算法,除非你的数字总是很小(比如说,小于10k)。使用具有已知上限的Miller Rabin测试的确定性版本(不是完整的上限,因为你已经知道了上限,否则你将生成所有的PositiveInfinity素数)。

答案 2 :(得分:1)

我只是会变得愚蠢并且给你一些我前段时间为信息学课程编写的代码。一切都很粗糙,因为它最初被设计为一些质量检查,因为一些waaaaaaayy太高的数字。

ulong min = 0;
ulong max = 100000;
ulong i = 0;
ulong sqrt = 0;
ulong j = 0;

bool prime = true;
for (i = min; i <= max; i += 2)
{
  prime = true;
  sqrt = Math.Sqrt(i) + 1;
  if (i % 2 == 0) prime = false;
  else for (j = 3; j < sqrt; j += 2)
  {
    if (i % j == 0)
    {
      prime = false;
      break;
    }
  }
  if(prime)
  {
    Console.WriteLine(i);
  }
}

它略有编辑,所以我不完全确定这是否会按预期工作,但自己编辑它并不困难。

答案 3 :(得分:0)

检查数字是否为素数的方法:

bool IsPrime(int number)
{
    for (int i = 2; i < sqrt(number); i++)
    {
         if (number%i == 0) return false;
    }
    return true;
}

对所有大小最多的整数调用此方法:

for (int crt = 1; crt <= max; crt++)
{
    if (IsPrime(crt))
    {
         Console.WriteLine(crt);
    }
}