2015-10-28 68 views
0
/*Print the first N prime numbers based on user input*/ 

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

bool isPrime(int N) { 
    if (N <= 0) {return false;} 
    double L = sqrt(N); 
    for (int i=2; i<=L; i++) { 
     if (N%i == 0) {return false;} 
    } 
    return true; 
} 

int main() 
{ 
    int Q = 0; //# of prime numbers to be found 
    int C = 0; //That's the counter 
    int I = 2; //Number to be check 
    cout<<"Number of prime numbers needed: "; 
    cin>>Q; 

    int primes [Q]; 

    while (true) { 
     if (C == Q) {break;} 
     if (isPrime(I)) { 
     primes[C] = I; 
     C++; 
     I++; 
     } 
    } 

    for (int i=0; i<Q; i++) { 
     cout<<primes[i]<<endl; 
    } 

    return 0; 
} 

這並不工作,並隨時打印2和1個屏幕,而不是質數列表,使用isPrime功能無法正常工作,可能出錯了我的數組C++數組長度可變行不通

+3

可變大小的數組是不是標準的C改變這種++,我建議使用'的std :: VECTOR'代替 – Slava

+0

你確定只想增加我只有當它是素數? –

+1

2和1?我最多得到2和3 - 三個素數或更多給予無限循環。 – molbdnilo

回答

3

I將遞增只有當原條件爲真,外面遞增,如果子句:

while (true) { 
    if (C == Q) {break;} 
    if (isPrime(I)) { 
     primes[C] = I; 
     C++; 
    } 
    I++; //here 
} 

C++陣列具有可變長度不會工作

它一直工作到c變量dosn't越過整數範圍或數組大小的堆棧幀。

+1

可變長度數組是非標準的。因此,他們只能在一些編譯器上工作。例如,這不會在Visual Studio下進行編譯(除非最近發生了變化),而是使用g ++。換句話說,謹慎使用,不要指望可移植性。 – user4581301

+0

@ user4581301自用戶dosent提到任何編譯器錯誤我回答基於這一點,並同意你在這種情況下'矢量'是更好的... – wrangler

+0

真的,我增量是問題,thx –

0

你在下面一行代碼有編譯器錯誤

int primes [Q]; 

必須與線下

int *primes = new int[Q]; 
+1

他也可以使用'std ::矢量素數(Q);'的確可能應該。 –

+1

如果推薦'new',你也應該明確提及在完成時需要'刪除'並防止出現意外。 – user4581301

+0

是的,在返回0之前;他必須添加delete []素數; –