Witam próbuję zaimplementować sito erastotenesa, z tego skryptu: http://students.mimuw.edu.pl/~szreder/skrypt.pdf -> 9 strona "Znajdowanie liczb pierwszych"
Jednak mam problem z wykreślaniem wielokrotności znalezionej liczby pierwszej, mam funkcję is_prime, która sprawdza czy liczba jest pierwsza, i jak dla mnie te wykreślanie powinno polegać na tym, że tworzę pętlę for z wielokrotnościami znalezionej liczby pierwszej i kod w tej pętli powinien być: is_prime(wielokrotnosc) = false; ale właśnie nie mogę zrobić takiego przypisania, bo mam error - "expression must be modifiable lvalue" - dobrze w ogóle myślę, że te wielokrotności mają być w ten sposób wykreślane?
Kod:
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace std;
bool is_prime(int x)
{
if (x == 1)
return false;
if (x == 2)
return true;
if (x % 2 == 0)// odrzucamy liczby parzyste, bo tylko dwójka jest liczbą pierwszą
for (int i = 3; i <= sqrt(x); i += 2)
{
if (x % i == 0)
{
return false;
return true;
}
}
}
void calc_primes()
{
int primes[8686]; // n/ln(n)
int prime_cnt = 0;
for (int i = 2; i < 100000; ++i)
{
if (!is_prime(i))
{
primes[prime_cnt++]=i;
for (int j = i + i; j < 100000; j += i)
{
is_prime(j) = false;
}
}
}
}
int main()
{
system("pause");
}
PS: Chcę zastosować te sito euklidesa do rozwiązania zadania ze SPOJ, dla przedziału 1-100000, dlatego takie konkretne wartości.
Ok, widzę, że najlepiej zastosować tu tablicę o indeksach od 0 - 100000, ustawić wszystkie wartości na 0, i zaś wykreślać przez ustawienie ich na '1', czyli prawda.