2013-07-27 71 views
-2

这是我的代码片段。基本上一旦按钮被点击,这个逻辑应该被触发并确定该数字是否为素数。问题在于,有些数字在现实中回归为“不是总理”。任何人都可以指出缺陷在哪里?检查素数 - C#逻辑

谢谢

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

什么数字是黄金,但被列为不是素数?什么素数和复合数字的工作?你已经尝试了什么? – zck

+0

基本上是第一个数字,例如2和3.我意识到逻辑应该是什么,应该用什么主体来找到素数,尽管我的编程技巧并没有让我写足够的智能代码。 –

回答

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

感谢您的输入。这工作就像一个魅力! 我一直在研究这个问题,并避免使用布尔来尽可能简化代码。但看起来我应该用bool方法来开始。 –

1

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

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

您可以减少对性能的影响就通过使用条件来检查前4个质数检查大的数字,然后由2开始循环在11和增量。事情是这样的:

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

+0

为什么要手动检查前四个? – Blender

+0

在我所做的测试中,我发现节省了大量时间。我认为条件使用比循环更少的开销。同样,如果你检查它,你会看到很高的百分比,可能80-90%的复合数字是前四个素数的倍数。 – tinstaafl

+0

如果你想要更快的东西,不要使用朴素的算法。优化它不会让它变得更快。 – Blender

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