maturalne2 z informatyki

Sylwia0922
Użytkownik
Użytkownik
Posty: 44
Rejestracja: 22 paź 2007, o 16:16
Płeć: Kobieta
Lokalizacja: Rzeszów

maturalne2 z informatyki

Post autor: Sylwia0922 »

hej,
mam problem jeszcze z jednym zadaniem. Byłbym wdzięczny za pomoc.
Treść:
Liczby pierwsze
Liczba pierwsza to liczba naturalna większa od 1, która ma dokładnie dwa dzielniki naturalne:
1 i samą siebie.
Przykłady liczb pierwszych:
7
11
29
Liczba 21 nie jest liczbą pierwszą, ponieważ oprócz liczby 1 i 21 jej dzielnikami są także
3 i 7.
W pliku o nazwie liczby.txt umieszczono w kolejnych wierszach 49 liczb całkowitych
dodatnich, po jednej w wierszu, z których każda liczba ma co najwyżej 6 cyfr. Napisz
program, za pomocą którego otrzymasz tylko te liczby z pliku liczby.txt, które są
kwadratami liczb pierwszych. Na przykład liczba 49 jest kwadratem liczby pierwszej –
49 = 7^2 . Wyniki zapisz w pliku zad_5.txt. Twój program powinien działać poprawnie
również wtedy, gdy plik liczby.txt będzie zawierał 49 innych liczb całkowitych
dodatnich, o co najwyżej 6 cyfrach, każda liczba w osobnym wierszu.

plik txt wygląda tak:
887055
146
96269
49157
565464
115357
5656
1427
410940
5041
11530
1300
44
548
80487
1736
594024
10333
978804
25203
964167
68201
25105
5457
809875
345
222
11671
2455
179842
44891
194872
15435
9871
349
2197
2586
263057
54456
90415
10450
2584
45641
18273
32147
78963
34775
11406


zadanie ma być wykonane w c++
marseel
Użytkownik
Użytkownik
Posty: 121
Rejestracja: 31 mar 2009, o 16:52
Płeć: Mężczyzna
Lokalizacja: Jaworzno
Pomógł: 20 razy

maturalne2 z informatyki

Post autor: marseel »

Kod: Zaznacz cały

//marseel#include <iostream>#include <map>//mozna zmniejszyc, program obsluguje liczby do okolo MAX*MAX#define MAX 1000001//pomocnicze makra#define REP(i,x,v)  for(int i=x;i<=v;i++)#define FOR(i,v)  REP(i,0,(int)(v)-1)using namespace std;//jak sie zmniejszy MAX to wtedy nie trzeba uzywac long longowtypedef long long ll;int main(){    bool sito[MAX];    map<ll,bool> kwadraty;    ll wejscie;    FOR(i,MAX) sito[i]=true;    sito[0]=sito[1]=false;// 0 i 1 nie sa liczbami pierwszymi    //szukanie liczb pierwszych za pomoca sita erastotenesa    FOR(i,MAX)    {        if(sito[i])        {            for(int j=2*i;j<MAX;j+=i)// dla kazdej wielokrotnosci i                sito[j]=false;//liczba j nie jest pierwsza, dzieli ja liczba i        }    }    //zapisywanie kwadratow liczb pierwszych    FOR(i,MAX)    {        if(sito[i])// jezeli i jest liczba pierwsza            kwadraty[(long long)i*i]=true;//zapisz, ze i*i jest kwadratem liczby pierwszej    }    while(cin>>wejscie)//pobieranie    {        if(kwadraty.find(wejscie)!=kwadraty.end())//jezeli jest kwadratem liczby pierwszej            cout << wejscie << endl;//wypisz    }    return 0;} 
Wystarczy tylko przekierować wejście wyjście np. w ten sposób:

Kod: Zaznacz cały

./program < plik_z_danymi.txt > odpowiedz.txt
ODPOWIEDZ