2012-04-02 57 views
0

所以我在嘗試項目歐拉的問題7。輸出錯誤項目歐拉7

通過列出前6個素數:2,3,5,7,11和13,我們可以看到第6個素數是13. 什麼是第10001個素數?

#include <iostream> 
#include <cmath> 
using namespace std; 

bool isPrime(int a){ 
    if (a==2||a==3){ 
     return true; 
    } 
    if (a%2==0){ 
     return false; 
    } 

    bool prime=true; 
    for (int b=2;b<sqrt(a);b++){ 
     if (a%b==0) 
      prime=false; 

    } 
    if (prime==true) 
     return true; 
    else 
     return false; 
} 

int main(){ 
    int infinite=0; 
    long long int primecounter=0; 
    for (int c=2;infinite==0;c++){ 
     if (isPrime(c)==true){ 
      primecounter++; 
      //cout<<c<<endl; 
      if (primecounter==10001) 
       {cout<<c; 

      break;} 
     } 
    } 
    return 0;} 

這就是我到目前爲止所提出的。它適用於我測試的少數數字,如第六個素數等。但是,當我運行10001素數時,它會給我104021,答案是錯誤的。有人能告訴我我的代碼有什麼問題嗎?

+1

效率說明:您可以從'3'開始'b'並使用'b + = 2'。更好的是,如果你將前面的素數保存在內存中,只需要在這些素數上得到'%',而不是所有數字。 – Shahbaz 2012-04-02 12:21:22

+1

你也不必在爲'中間狀態(INT C = 2;無限== 0; C++)' - 如果你等於永遠終止你可以讓它空'的for(int C = 2 ;; C++) '。 – Rup 2012-04-02 12:23:15

+1

備註:你可以寫'return prime;'!另外,不是'無限== 0',你可以寫'true'(甚至不寫),並且完全刪除無限。此外,'if(isPrime(c))'完全有效。 – Shahbaz 2012-04-02 12:23:49

回答

8

你在哪裏得到它錯了就是b < sqrt(a)。想想a = 25,在這種情況下會發生什麼?

答案的其餘部分已經被評論指出。

+0

謝謝。它現在完美工作:D – cortex 2012-04-02 13:05:52

1

雖然這不是必需的特定問題,您應該看一看Sieve of Eratosthenes算法。遲早你會需要它來解決與素數有關的問題。

0

你可以在沒有得到'cmath'幫助的情況下解決它。邏輯就像... 要檢查數字是否爲素數,請將計數器變量設置爲0;寫一個循環,把每一個小於它的數字除以1,如果一個數字完全除以它,計數器將增加1;對於一個素數來說,counetr恰好是2。 要計算出這麼大的數字,你應該選擇一個合適的數據類型。我已經使用'long long int'作爲數據類型。 我的項目歐拉問題沒有7碼是follows.Hope它有助於you.Best wishes.Editions和改進這個方案是最welcome.Only錯誤是,它消耗的時間,它需要一個多小時到達10001的素數。

 #include<iostream.h> 
     #include<conio.h> 
      class prime 
      { 
       long long int a; 
       long long int j,i; 
       public: 
      void display(); 
       }; 

     void prime::display() 
      { 
        j=0; 
       long long int count=0; 
       long long int count1=0; 
       while(count1!=10001) 
       { 
        j=j+1; 
        i=j; 
        while(i!=0) 
        { 
         if(j%i==0) 
          { 
          count++; 
          } 
         i--; 
        } 
        if(count==2) 
         { 
          count1++; 
          cout<<count1<<"\t"; //The serial number of the prime number. 

          cout<<j<<"\t";// This will diaply all prime numbers till 10001. 

         } 
        if(count1==10001) 
         { 
          cout<<"\nThe 10001th prime number is:"<<j; 
         } 
         count=0; 
        } 
       } 

        void main() 
         { 
           prime k; 
           clrscr();         
           k.display(); 
           getch(); 
          }