在C#中查找素数

时间:2013-11-16 19:54:42

标签: c# primes

好的,我想从控制台输入一个整数,并检查数字是否为素数。 我挖了一个代码,然后根据我的需要对其进行了转换,但计算不正确。

using System;
    class PrimeNumber
    {
    static void Main()
    {
        Console.Write("Type a number: ");
        string line = Console.ReadLine(); // Read string from console
        int value;
        if (int.TryParse(line, out value)) // Try to parse the string as an integer
        {
            int x = 0;
            if (value == 1) Console.WriteLine("not prime");
            if (value == 2) Console.WriteLine("prime");
            for (int i = 3; i < value*value; i+=2)
            {
                if (value % 2 == 0) x++; break;
                if (value % i == 0) x++; break;
            }
            Console.WriteLine(x);
            if (x == 0) Console.WriteLine(value + " is prime");
            else Console.WriteLine(value + " is not prime");
        }
        else
        {
            Console.WriteLine("Invalid input.");
        }
    }
}

3 个答案:

答案 0 :(得分:5)

问题在于:

if (value % 2 == 0) x++; break;
if (value % i == 0) x++; break;

break语句if的一部分,只有x++是...所以break总是执行,无论条件是否为真。

你应该用大括号括起来:

if (value % 2 == 0) { x++; break; }
if (value % i == 0) { x++; break; }

另外两个问题:

  • 你应该把if (value % 2 == 0)放在循环之外,因为在每次迭代时再次检查它是没用的。
  • 你应该停止在sqrt(value)(包括)的迭代,而不是value²。如果您转到value²,则某时i将等于value,因此value % i将为0,且该数字不会被视为素数。

答案 1 :(得分:2)

这是查找数字是否为素数的有效方法。

static bool IsPrime(int n)
{
    for(int i = 2; i <= Math.Sqrt(n); i++)
    {
        if(n % i == 0)
            return false;
    }
    return true;
}

答案 2 :(得分:0)

您还可以使用eratosthenes筛,有效生成素数: 我的实施:

static int[] GenerateEratosthen()
    {
        bool[] e = new bool[200000];
        for (int i = 2; i < 200000; i++)
        {
            for (int j = 2; j * i < 200000; j++)
            {
                e[j * i] = true;
            }
        }
        int[] p = new int[20000];
        int k = 0;
        for (int i = 1; i < 200000; i++)
        {
            if (!e[i])
                p[k++] = i;
        }
        return p;
    }