C++ liczby pierwsze

marcin9408
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 24 paź 2010, o 14:37
Płeć: Mężczyzna
Podziękował: 10 razy

C++ liczby pierwsze

Post autor: marcin9408 »

Napisz program wypisujący na ekran liczby pierwsze z ustalonego przedziału. Po sprawdzeniu czy liczba jest pierwsza komputer wypisze na ekran 2 najbliżej sąsiadujące liczby złożone.
Tyle zrobiłem, ale nie działa.

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>

using namespace std;

float pierwsze(int a, int b)
{
 if(a>b)
 {
           return 0;
           }
 else
 {
     for ( int i=a; i<=b; i++)       
             for (int j = 2; j<=i;++j)   
             if ((i % j) == 0)
                  cout << i;
             int n1, n2;
             n1=i-1;
             n2=i+1;
             if(i=2 || i=3)
             {
                    n1=4;
                    n2=6;
                    }
                    cout << n1 << n2;
             


}    
}     
int main()
{
    int a, b;

do {
cout << "Podaj zakres dolny: ";
cin >> a;

cout << "Podaj zakres gorny: ";
cin >> b;
cout << endl;

if ( b <= a )
cout << "Zakres dolny musi byc mniejszy niz gorny!" << endl;

} while ( b <= a );

cout << pierwsze(a,b);

    
    system("PAUSE");
    return 0;
}
Xitami

C++ liczby pierwsze

Post autor: Xitami »

dla zakresu 0,12 miałoby to wyglądać tak?
2 1 4
3 1 4
5 4 6
7 6 8
11 10 12
marcin9408
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 24 paź 2010, o 14:37
Płeć: Mężczyzna
Podziękował: 10 razy

C++ liczby pierwsze

Post autor: marcin9408 »

dla zakresu <0, 12> miałoby to wyglądać tak, że:

2 - 4,6
3 - 4,6
5 - 4,6
7 - 6,8
11 - 10,12

@up - 1 nie jest liczbą złożoną
Xitami

C++ liczby pierwsze

Post autor: Xitami »

Kod: Zaznacz cały

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

//już wcześniej sprawdziłeś że a<=b
void pierwsze(int a, int b){          // było float
	for (int  i=a; i<=b; i++)        
		for (int j = 2; j<=i;++j)   
			if ((i % j) == 0) 
				cout << i; // skoro się dzieli to jak może być pierwsze?
	int n1, n2;
	n1=i-1;
	n2=i+1;
	if(2==i || 3==i){              //  nawet jak napiszesz 2=i kompilator ci to pokaże 
		n1=4; n2=6; }
	cout << n1 << n2;
}   
  
int main(){
	int a, b;
	do {
		cout << "Podaj zakres dolny: "; cin >> a;
		cout << "Podaj zakres gorny: "; cin >> b;
		cout << endl;
		if ( b <= a )
			cout << "Zakres dolny musi byc mniejszy niz gorny!" << endl;
	} while ( b <= a );
	pierwsze(a,b);         // a co niby zwraca pierwsza?
	system("PAUSE");
	return 0;
}
poprawiłem ortografię, nie poprawiałem logiki
chyba nie tak to planowałeś
popatrz na wcięcia
napisz funkcję bool pierwsza(int a)
łatwiej się połapiesz
while(a<=b) 
	if pierwsza(a){ 
		......
		cout a++<<n1<<n2
	}
marcin9408
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 24 paź 2010, o 14:37
Płeć: Mężczyzna
Podziękował: 10 razy

C++ liczby pierwsze

Post autor: marcin9408 »

Tyle zrobiłem, ale coś nie działa z s1 i s2, ponieważ wypisują 2 sąsiadujące liczby dla wszystkich liczb,a nie tylko dla pierwszych.
s1 i s2 mają wypisywać 2 najbliżej sąsiadujące liczby złożone dla liczb pierwszych.

Kod: Zaznacz cały

#include <cstdlib>
#include <iostream>
using namespace std;
 
const int n = 10000;
 
bool numbersTable[n + 1]; // tablica o indeksach od 0 do 100 | wszystkie false (czyli: 0);
 
int main()
{
    int a,n, s1, s2;
    cout << "Podaj a: ";
    cin >> a;
    cout << "Podaj n: ";
    cin >> n;
    
        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 liczb 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"<< a<< " do " << n << ":" << endl;
 
        for (int i = a; i <= n; i++) // przeszukaj liczby od a do n
                {if (numbersTable[i] == false) // jeśli liczba nie została usunięta ze zbioru
                        cout << i << endl; // to ją wypisz
                        s1=i-1;
                        s2=i+1;
                        }
                        cout << s1 << "," << s2<< endl;;
                        
                        
        system("PAUSE");
        return 0;
}
Xitami

C++ liczby pierwsze

Post autor: Xitami »

napisałeś

Kod: Zaznacz cały

        for (int i = a; i <= n; i++)
        {
                if (numbersTable[i] == false) 
                        cout << i << endl; // czy tu ma być endl?
                s1=i-1;
                s2=i+1;
        }
        cout << s1 << "," << s2<< endl;;
a co gdy i równe 2 lub 3?
2 1,3
3 2,4
marcin9408
Użytkownik
Użytkownik
Posty: 29
Rejestracja: 24 paź 2010, o 14:37
Płeć: Mężczyzna
Podziękował: 10 razy

C++ liczby pierwsze

Post autor: marcin9408 »

no ja to wiem tylko najpierw musi tamto zadziałać żeby ustalać dla 2 i 3 najbliższe liczby
Xitami

C++ liczby pierwsze

Post autor: Xitami »

Xitami pisze:napisałeś

Kod: Zaznacz cały

        for (int i = a; i <= n; i++)
        {
                if (numbersTable[i] == false) 
                        cout << i << endl; // czy tu ma być endl?
                s1=i-1;   // czy to ma być po IF
                s2=i+1;
        }
        cout << s1 << "," << s2<< endl;;  // a to po pętli
ODPOWIEDZ