2016-04-16 7 views
1

Im folgenden Code habe ich Bitmasking für die Erzeugung von Primzahlen verwendet, aber leider funktioniert es nicht richtig eher dieses Programm stürzt während des Laufens.Ich freue mich auf eine Lösung ..Prime Generieren mit Bit-Maskierung verursacht Programm zum Absturz

#include <bits/stdc++.h> 
#define maxn 65540 
using namespace std; 

int _c[(maxn>>6)+1]; //as we will be neede max 

int primes[maxn]; 


#define IsComp(n) (_c[n>>6]&(1<<((n>>1)&31)))//to compare bit 
#define SetComp(n) _c[n>>6]|=(1<<((n>>1)&31))//to set the bit 
void prime_sieve() { 
for (int i = 3; i <=maxn; i += 2) 
    if (!IsComp(i)) 
     for (int j = i*i; j <=maxn; j += i+i) 
      SetComp(j);//if the number is not primes then it is changed  to 1 

primes[0]=2;//first prime is 2; 
int j=1; 
for (int i=3; i <= maxn; i += 2) 
    if (!IsComp(i)) 
     primes[j++]=i;//putting the value in primes array; 
} 
int main() 
{ 

prime_sieve();//calling the function 
//Prime(); 
} 
+0

Es hilft Ihnen, Details zum Absturz des Codes zur Verfügung zu stellen? Kompilieren Sie nicht oder geben Sie einen Laufzeitfehler? –

+0

@AmmarHusain Code es kompilieren, aber ich denke, beim Generieren dieser Primzahlen der Code auf meiner IDE stürzt ab .. übrigens danke für Ihre Antwort. –

+0

Was genau läuft schief? Und deine Codeformatierung ist ziemlich horrend. Auch die Verwendung globaler Variablen ist eine schlechte Vorgehensweise. Anstelle von Makros sollten auch Lambdas oder Funktionsobjekte verwendet werden. – Charles

Antwort

1

Von dem, was ich verstehen kann, wenn die äußere Schleife (i) läuft bis 46348 es funktioniert gut als i * i unter dem Bereich 2147483648, aber wenn ich 46349 wird es integer-Überlauf in j-Wert und es ist Wert wird -2146737495 und folgt dann setComp (j) mit j als negativ.

Verwandte Themen