检查素数 - C#逻辑

时间:2013-07-27 06:40:51

标签: c# primes

以下是我的代码中的代码段。基本上,一旦单击该按钮,该逻辑应该触发并确定该数字是否为素数。问题是有些数字正在返回“不是素数”,实际上它们是。谁能指出这个缺陷在哪里?

谢谢

    private void bntTestPrime_Click(object sender, EventArgs e)
    {
        int num;
        double num_sqrt;
        int num_fl;

        num = Convert.ToInt32(txtInput.Text);

        num_sqrt = Math.Sqrt(num);

        num_fl = Convert.ToInt32(Math.Floor(num_sqrt));

        for (int i = 1; i <= num_fl; i++)
        {
            if (num % i == 0 && i != num)
                lblResult_prime.Text = "Number " + num + " is not Prime.";
            else
                lblResult_prime.Text = "Number " + num + " is Prime.";
        }

    }

6 个答案:

答案 0 :(得分:1)

1是每个数字的因子,因此您不应该检查它。从2开始。此外,您已经从2循环到sqrt(num),因此i无法等于num

答案 1 :(得分:1)

要添加到Blender's answer,我想指出您只是在每个迭代循环上设置输出文本。这意味着您的结果将仅取决于检查的最后一个数字。你需要做的是假设数字是素数并循环直到找到除数。如果找到除数。当且仅当没有找到除数时,该数字才是素数。最后代码看起来像这样:

private bool IsPrime(int num)
{
    double num_sqrt = Math.Sqrt(num);
    int num_fl = Convert.ToInt32(Math.Floor(num_sqrt));

    for (int i = 2; i <= num_fl; i++)
    {
        if (num % i == 0)
        {
            return false;
       }
    }
    return true;
}

private void bntTestPrime_Click(object sender, EventArgs e)
{
    int num = Convert.ToInt32(txtInput.Text);
    bool isPrime = IsPrime(num);
    if (isPrime)
        lblResult_prime.Text = "Number " + num + " is Prime.";
    else
        lblResult_prime.Text = "Number " + num + " is not Prime.";
}

答案 2 :(得分:1)

你可以通过使用条件检查前4个素数来减少检查大数字的性能,然后在11开始循环并增加2.这样的事情:

    private bool IsPrime(int num)
    {
        double num_sqrt = Math.Sqrt(num);
        int num_fl = Convert.ToInt32(Math.Floor(num_sqrt));
        if (num !=1 && num !=2 && num != 3 && num != 5 && num != 7 && num % 2 > 0 _
            && num % 3 > 0 && num % 5 > 0 && num % 7 > 0)
        {
            for (int i = 11; i <= num_fl; i+=2)
            {
                if (num % i == 0)
                {
                    return false;
                }
            }
        }
        else
            return false;
        return true;
    }

通过使用足够大的素数列表来覆盖您想要检查的上限,您可以缩短代码并极大地提高性能。然后使用Contains方法测试素数。

答案 3 :(得分:0)

尝试以下代码。

bool IsPrime(int number) {

   if(number%2==0 && number!=2) return false; //no need to check for even numbers
   for (int i = 2; i < number; i++) {


     if (number % i == 0 && i != number) return false;
   }
   return true;
}

答案 4 :(得分:0)

请尝试以下代码:

bool isPrimeNubmer(int n)
    {
        if (n >=0 && n < 4) //1, 2, 3 are prime numbers
            return true;
        else if (n % 2 == 0) //even numbers are not prime numbers
            return false;
        else
        {
            int j = 3;
            int k = (n + 1) / 2 ;

            while (j <= k)
            {
                if (n % j == 0)
                    return false;
                j = j + 2;
            }
            return true;
        }
    }

答案 5 :(得分:0)

public class PrimeChecker
{
    public static bool Prime(int m) 
{ 
    for (int i =2; i< m; i++)
        {
        if (m % i ==0)
            {
             return false ;
            }
        }
return true; 
    }
public static void Main()
{
        Console.WriteLine(Prime(13));

    }
}