【问题标题】:Checking for prime number - C# logic检查素数 - C# 逻辑
【发布时间】:2013-07-27 06:40:51
【问题描述】:

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

谢谢

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

    }

【问题讨论】:

  • 哪些数是质数,但被列为非质数?哪些素数和合数有效?你已经尝试过什么?
  • 基本上是第一个数字,例如 2 和 3。我知道逻辑应该是什么以及应该使用什么主体来查找素数,尽管我的编程技能不允许我写足够智能的代​​码。

标签: c# primes


【解决方案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.";
}

【讨论】:

  • 感谢您的意见。这就像一个魅力!我一直在研究这个问题并避免使用 bool 来获得尽可能简单的代码。但看起来我应该使用 bool 方法开始。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    您可以通过使用条件检查前 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 方法测试素数。

    【讨论】:

    • 在我完成的测试中,我发现节省了大量时间。我认为条件使用的开销比循环少。此外,如果您检查它,您会发现很大一部分可能是 80-90% 的合数是前 4 个素数的倍数。
    • 如果你想要快速的东西,不要使用简单的算法。优化它不会让它变快。
    • 我没有说它快只是快。如果您阅读了整个答案,我提供了一种更快的方法。
    【解决方案4】:

    试试下面的代码。

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

    【讨论】:

      【解决方案5】:

      试试下面的代码:

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

      【讨论】:

        【解决方案6】:
        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));
        
            }
        }
        

        【讨论】:

          猜你喜欢
          • 2021-08-20
          • 1970-01-01
          • 1970-01-01
          • 2020-08-07
          • 1970-01-01
          • 1970-01-01
          • 2022-11-14
          • 1970-01-01
          • 2021-07-05
          相关资源
          最近更新 更多