Sito Eratostenesa dla liczb pierwszych na tablicy bool problem z porownaniem

0

Witam jako że jestem malo doświadczony w kwestii c++ / obiektowosci, a dostalem do napisania program w ktorym z Podanych przy wywołaniu (parametry wywolania) wartosci dla najwiekszej zostaje ona wypisana i dla takiej wartosci tworzy sie Sito Eratostenesa na tablicy bool, później program dla zadanych w parametrach liczb wypisuje "pierwsza" /"nie pierwsza".

Stworzyłem funkcje ktora znajduje największy parametr, dalej w mainie wywolywana jest funkcja Sita na tym parametrze ale mam problem zeby zmusic program do porownania vectora z parametrami z tablica liczb pierwszych od 0 do Maksymalnego parametru.
vector "tab" posiada to co podal uzytkownik i chce sprawdzic czy te elementy znajduja sie w tablicy globalnej ze wszystkimi Pierwszymi do zadanego maksymalnego parametru [ cos takiego **if (tab[i]==Pierwsze[i]) cout << "jest pierwsza" << endl; ** ] wielu kombinacji juz probowalem dostawalem wiele errorow po kilkukrotnym ich zlikwidowaniu program najczesciej nie chcial wypisac nic opr najwiekszeg parametru :X

Wołam/Błagam o pomoc bo nie moge sie przebić glowa przez ten problem.
Zastanawiałem sie nad użyciem wyjątków do obsługi tego ale ostatecznie skapitulowałem, wklejam kod którejś tam ostatniej próby wiec może być trochę namieszane w niektórych miejscach bo próbowałem juz wszystkiego (chyba). Pomocy ! :C

#include <iostream>
#include <cstdlib>
#include <vector>

using namespace std;
int *Pierwsze;


int wybierzNajwieksza(vector<int>tab) {
int max = 0;
int hand = 0;

		for (int i = 0; i <tab.size(); i++) {
		
			hand = tab[i];
			if (hand > max)
			{
				max = hand;
				
			}
		}
return max;
}

int SitoEratostenesa(int n) {

  
bool *tablicaLiczb = new bool[n+1];
for (int i = 2; i * i <= n; i++) {
if (tablicaLiczb[i] == true)
continue;
for (int j = 2 * i; j <= n; j += i) {
tablicaLiczb[j] = true;
}
		}
for (int i = 2; i <= n; i++) { // przeszukaj liczby od 2 do n
        if (tablicaLiczb[i] == false) { // jeśli liczba nie została usunięta ze zbioru	
		for (int i = 0; Pierwsze[i]<Pierwsze[n+1]; i++) {
		Pierwsze[i]=i;
			
		}       
	}
}
}

int main(int argc, char *argv[]) {
int Maximum;

Pierwsze = new int[Maximum+1];
vector <int> tab;
for (int i=0; i<argc; i++) {
tab.push_back(atoi(argv[i]));
}
Maximum= wybierzNajwieksza(tab);

cout << "Najwiekszy argument z podanych liczb to: " << Maximum << endl;

SitoEratostenesa(Maximum);

for (int i = 0; Pierwsze[i]<Pierwsze[Maximum+1]; i++) {
	for ( int i = 0; tab[i]<tab.size(); i++) {

		if ( tab[i] == Pierwsze[i])
		cout << tab[i] << " jest liczba pierwsza " << endl;
		else 
		cout << tab[i] << " nie jest liczba pierwsza " << endl;
	}
}

return 0; 
         }

Program w tej postaci nie chce pokazac nic wiecej po za najwiekszym parametrem .

0

To co stworzyłeś to jakiś potworny bezsens bez formatowania.

#include <iostream>
#include <vector>
#include <cstdlib>
using namespace std;

int main(int n,char *p[])
  {
   vector<int> Tb(--n);
   for(int i=0;i<n;++i) Tb[i]=atoi(p[i+1]);
   int max=0;
   for(int i=0;i<n;++i) if(max<Tb[i]) max=Tb[i];
   vector<bool> sito(max+1);
   sito[0]=sito[1]=true;
   for(int i=2;i*i<=max;++i) if(!sito[i]) for(int k=2*i;k<=max;k+=i) sito[k]=true;
   for(int i=0;i<Tb.size();++i)
     {
      cout<<Tb[i]<<(sito[Tb[i]]?" nie":"")<<" jest liczba pierwsza"<<endl;
     }
   return 0;
  }
0
Lion napisał(a):

Witam jako że jestem malo doświadczony w kwestii c++ / obiektowosci, a dostalem do napisania program w ktorym z Podanych przy wywołaniu (parametry wywolania) wartosci dla najwiekszej zostaje ona wypisana i dla takiej wartosci tworzy sie Sito Eratostenesa na tablicy bool, później program dla zadanych w parametrach liczb wypisuje "pierwsza" /"nie pierwsza".

Nic nie zrozumiałem z tego.

0

Czy jest jakis szybki sposob aby przy wpisaniu zamiast liczby, jakiś znaków ten program podany przez _13th_Dragon nie wyświetlał 0 nie jest pierwsza tylko " nie jest liczba " ? i czy do bledu naruszenia pamieci sluzy wyjatek bad alloc ?

0
Lion napisał(a):

Czy jest jakis szybki sposob aby przy wpisaniu zamiast liczby, jakiś znaków ten program podany przez _13th_Dragon nie wyświetlał 0 nie jest pierwsza tylko " nie jest liczba " ? i czy do bledu naruszenia pamieci sluzy wyjatek bad alloc ?

Dlaczego pytasz?

0
Lion napisał(a):

Czy jest jakis szybki sposob aby przy wpisaniu zamiast liczby, jakiś znaków ten program podany przez _13th_Dragon nie wyświetlał 0 nie jest pierwsza tylko " nie jest liczba " ?

#include <iostream>
#include <vector>
#include <cstdlib>
#include <cstdio>
using namespace std;
 
int main(int n,char *p[])
  {
   vector<int> Tb(--n);
   for(int i=0;i<n;++i) if(sscanf(p[i+1],"%d%c",&Tb[i],&Tb[i])!=1) Tb[i]=-1; // -1 jeżeli nie konwertuje się
   int max=0;
   for(int i=0;i<n;++i) if(max<Tb[i]) max=Tb[i]; // znajdujemy max
   vector<bool> sito(max+1); // odpowiednio długie sito
   sito[0]=sito[1]=true; // 0 i 1 nie są pierwsze
   for(int i=2;i*i<=max;++i) if(!sito[i]) for(int k=2*i;k<=max;k+=i) sito[k]=true; // budujemy sito
   for(int i=0;i<Tb.size();++i) // dla każdego argumentu programu
     {
      if(Tb[i]<0) cout<<p[i+1]<<" nie jest liczba naturalna"<<endl; // dla ujemnych
      else cout<<p[i+1]<<(sito[Tb[i]]?" nie":"")<<" jest liczba pierwsza"<<endl; // dla pozostałych
     }
   return 0;
  }
Lion napisał(a):

będę jeszcze na tyle bezczelny ze zapytam czy mógłbyś mi nakreślić co zrobiłem zle w swoim kodzie ?
Podstawowy błąd: - nie stosujesz formatowania w związku z czym utrudniasz nam oraz uniemożliwiasz sobie jakąkolwiek analizę kodu w tym znalezienie jakiegokolwiek błędu.

0

Podziel to sobie w miarę rozsądnie na funkcje, zamiast ładować wszystko w main(). W szczególności budowanie sita wydziel do osobnej funkcji, to wiele pomoże. Przykład:

#include <iostream>
#include <sstream>
#include <iomanip>
#include <string>
#include <vector>
#include <algorithm>
#include <cmath>
#include <stdexcept>

int strToInt(std::string s) {
    int num;
    std::istringstream is(s);
    is >> num;
    if (!is || is.peek() != std::char_traits<char>::eof()) {
        std::cerr << s << " nie jest liczba calkowita\n";
        return -1;
    }
    return num;
}

std::vector<bool> sieve(int max) {
    ++max; // include max in sieve
    std::vector<bool> vec(max, true);
    int sqrtMax = std::sqrt(max);
    vec[0] = vec[1] = false;
    int index = 2;
    while (index <= sqrtMax) {
        for (size_t i = 2; index*i < vec.size(); ++i) {
            vec[i*index] = false;
        }
        while (!vec[++index])
            continue;
    }
    return vec;
}

int main(int argc, char** argv) {
    std::vector<std::string> params;
    std::vector<int> nums;
    std::copy(argv, argv + argc, std::back_inserter(params));
    std::transform(params.begin() + 1, params.end(), std::back_inserter(nums), &strToInt);
    int max = *std::max_element(nums.begin(), nums.end());
    std::cout << "Najwieksza liczba to " << max << "\n";
    if (max < 2) {
        std::cerr << "Liczba jest za mala do zbudowania sita\n";
        return -1;
    }
    std::vector<bool> vec = sieve(max);
    for (size_t i = 2; i < vec.size(); ++i) {
        std::cout << std::setw(5) << i << (vec[i] ? " +++ pierwsza" : " --- zlozona") << "\n";
    }
}

Z C++11 dałoby się oczywiście zwięźlej i krócej, ale nie mam teraz dostępu do czegoś nowszego, więc zostanie tak jak jest. :)

0

Moja propozycja:

#include <QRegExp>
#include <QVector>
#include <cmath>
#include <iostream>
#include <cstdlib>

typedef unsigned long long ultyp;
typedef const ultyp cultyp;

QVector<ultyp> parseArgs(  int argc , char *argv[] ) {
	Q_ASSERT( argc > 1 );
	QVector<ultyp> args;
	QRegExp rx("^\\s*[0-9]+\\s*$");
	for( int i=1 ; i<argc ; i++ ) {
		Q_ASSERT( rx.indexIn( argv[i] ) != -1 );
		args.append( (ultyp)atoll(argv[i]) );
	}
	return args;
}

ultyp findMax( const QVector<ultyp> &args ) {
	ultyp max = args[0];
	for( int i=1 ; i<args.size() ; i++ )
		if( max < args[i] )
			max = args[i];
	return max;
}

int main( int argc , char *argv[] ) {
	const QVector<ultyp> args = parseArgs( argc , argv );
	cultyp max = findMax( args );
	QVector<ultyp> prims;
	prims.append(2);
	prims.append(3);
	for( ultyp i=5 ; i<=max ; i++ ) {
		ultyp j=0;
		while( prims[j]*prims[j] <= i && i%prims[j] )
			j++;
		if( prims[j]*prims[j] > i )
			prims.append(i);
	}
	for( int i=0 ; i<args.size() ; i++ )
		std::cout<< ( prims.indexOf( args[i] ) == -1 ? "złożona:" : "pierwsza:" ) << args[i] << std::endl;

	return 0;
}

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