-2

这是我的代码片段。基本上,一旦单击按钮,此逻辑就会触发并确定数字是否为素数。问题是一些数字返回为“非质数”,而实际上它们是。谁能指出缺陷在哪里?

谢谢

    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.";
        }

    }
4

6 回答 6

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 方法测试素数。

于 2013-07-27T08:07:14.110 回答
1

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

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.";
}
于 2013-07-27T06:52:47.333 回答
1

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

于 2013-07-27T06:45:30.453 回答
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;
}
于 2013-07-27T06:52:23.387 回答
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;
        }
    }
于 2015-05-21T18:38:20.507 回答
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));

    }
}
于 2019-03-20T03:14:46.197 回答