2013-07-27 76 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; 
     } 
    }