Sito Eratostenesa - szukanie liczb pierwszych z przedziału

0

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.

@Edit

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.

0
#include <iostream>
using namespace std;

bool Tb[10001]={true,true};

int main()
  {
   for(unsigned i=2;i<=100;++i) if(!Tb[i]) for(unsigned k=i*i;k<10001;k+=i) Tb[k]=true;
   unsigned tst;
   cin>>tst;
   while(tst--)
     {
      unsigned x;
      cin>>x;  	  	
      cout<<(Tb[x]?"NIE":"TAK")<<endl;
     }
   return 0;
  }
0

@_13th_Dragon ogólnie nie chciałem gotowca, tylko sam do tego dojść:P

Mógłby ktoś mi wytłumaczyć coś:

#include <iostream>
 
using namespace std;
 
const int n = 100;
 
bool numbersTable[n + 1]; // tablica o indeksach od 0 do 100 | wszystkie false (czyli: 0);
 
int main()
{
    for (int i = 2; i*i <= n; i++ ) // przeszukuj liczby od 2 do sqrt(n), 0 i 1 nie są liczbami pierwszymi
    {
        if (numbersTable[i] == true) // jeżeli dana liczba jest już wykreślona
            continue; // to przejdź do kolejnej
        for (int j = 2*i ; j <= n; j += i) // przejdź od liczby 2*i do n przesuwając się o i
            numbersTable[j] = true; // i każdą z nich usuwaj ze zbioru
    }
 
    cout << "Liczby pierwsze z przedziału od 2 do " << n << ":" << endl;
 
    for (int i = 2; i <= n; i++) // przeszukaj liczby od 2 do n
        if (numbersTable[i] == false) // jeśli liczba nie została usunięta ze zbioru
            cout << i << endl; // to ją wypisz
    return 0;
}

Na jakiej zasadzie są tu szukane liczby pierwsze, skoro nie ma tu żadnej funkcji, ani instrukcji warunkowej, typu:

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;
            }
        }
}
 

???

1

_13th_Dragon,
warunek

if(!Tb[i])

możesz pominąć, bo jest zawsze spełniony.

0
andrzuk napisał(a):

_13th_Dragon,
warunek

if(!Tb[i])

możesz pominąć, bo jest zawsze spełniony.

Że jak? Może usuń i sprawdź czy nadal będzie działać tak samo szybko. ;P

1 użytkowników online, w tym zalogowanych: 0, gości: 1