Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

[C++] Obliczanie kwadratu liczb pierwszych

Ostatnio zmodyfikowano 2014-07-01 14:32
Autor Wiadomość
Pawlllosss
Temat założony przez niniejszego użytkownika
[C++] Obliczanie kwadratu liczb pierwszych
» 2014-07-01 12:48:25
Witajcie bracie programiści!

Jako, że przygotowuję się do matury z informatyki chciałem porozwiązywać jakieś zadania z poprzednich matur. Program ma za zadanie oczytać z pliku liczby.txt 500 liczb o długości nie większej niż 6 cyfr każda i wskazać, która z nich jest kwadratem liczby pierwszej.

Podaje poprawne wyniki poza ostatnią liczbą, która jest na minusie i z tym mam problem:

5041
16
1369
32041
256
729
844561
10000
4
96721
9
942841
49
1849
528529
121
961
169
-741158448

Oto zawartość tego pliku:
http://wklej.org/id/1406565/

Oto mój kod źródłowy:
C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

bool czykwadrat( int a )
{
    for( int i = 2; i * i <= a; i++ )
    {
        if( i * i == a )
             return true;
       
    }
   
    return false;
}

int main()
{
    int a, i = 0, tab[ 500 ];
    ifstream plik;
    plik.open( "liczby.txt" );
   
    while( plik.good() )
    {
        plik >> a;
        if( czykwadrat( a ) )
        {
            tab[ i ] = a;
            i++;
        }
    }
   
   
    for( int j = 0; j <= i; j++ )
    {
        cout << tab[ j ] << endl;
    }
   
    system( "PAUSE" );
   
    return 0;
}
P-113021
Monika90
» 2014-07-01 13:05:57
Nie sprawdzasz czy ta operacja
plik >> a;
 zakończyła się sukcesem.
P-113024
Jacob99
» 2014-07-01 13:11:25
C/C++
bool czykwadrat( int a )
{
    for( int i = 2; i * i <= a; i++ )
    {
        if( i * i == a )
             return true;
       
    }
   
    return false;
}

Ta funkcja nie sprawdza czy a jest kwadratem liczby pierwszej, tylko sprawdza ogólnie czy a jest kwadratem jakiejś liczby z zakresu [a, n).
P-113026
Pawlllosss
Temat założony przez niniejszego użytkownika
» 2014-07-01 13:15:36
A to w takim razie nie wystarcza samo sprawdzanie czy z plikiem wszystko w porządku poprzez plik.good()?

Nie wiem za bardzo jakby to miało wyglądać, bo np.taka zmiana nic mi nie daje:
C/C++
while( plik.good() )
{
    plik >> a;
    if( !plik.fail() )
    {
        if( czykwadrat( a ) )
        {
            tab[ i ] = a;
            i++;
        }
    }
}

Przerobiłem swój kod, żeby jeszcze sprawdzał czy jest to kwadrat liczby pierwszej(dzięki za zwrócenie uwagi), ale dalej ostatnia cyfra jest minusowa.

5041
1369
32041
844561
4
96721
9
942841
49
1849
528529
121
961
169
-1010646592


C/C++
#include <iostream>
#include <fstream>
#include <cstdlib>

using namespace std;

bool czypierwsza( int i )
{
    if( i < 2 )
         return false;
   
    for( int j = 2; j * j <= i; j++ )
    {
        if( i % j == 0 )
             return false;
       
    }
   
    return true;
}

bool czykwadrat( int a )
{
    for( int i = 2; i * i <= a; i++ )
    {
        if( i * i == a )
        {
            bool test = czypierwsza( i );
            return test;
        }
       
    }
   
    return false;
}

int main()
{
    int a, i = 0, tab[ 500 ];
    ifstream plik;
    plik.open( "liczby.txt" );
   
    while( plik.good() )
    {
        plik >> a;
        if( !plik.fail() )
        {
            if( czykwadrat( a ) )
            {
                tab[ i ] = a;
                i++;
            }
        }
    }
   
   
    ofstream wynik;
    wynik.open( "odpowiedz.txt" );
   
   
    for( int j = 0; j <= i; j++ )
    {
        cout << tab[ j ] << endl;
        wynik << tab[ j ] << endl;
    }
   
    system( "PAUSE" );
   
    return 0;
}
P-113028
Jacob99
» 2014-07-01 13:27:20
C/C++
while( plik.good() )
{
    //...
}
Tym sprawdzasz czy udało się poprawnie otworzyć plik.
chodzi o to, aby sprawdzić, czy udało się wczytać liczbę, czyli:
C/C++
plik.open( "liczby.txt" );
if( !plik.good() )
     cout << "nie udało się otworzyc pliku!\n";

while( plik >> a )
{
    if( czykwadrat( a ) )
    {
        tab[ i ] = a;
        i++;
    }
}


Do znalezienia liczb pierwszych dobrym sposobem jest sito Eratostenesa:
sito eratostenesa- algorytm
P-113029
Pawlllosss
Temat założony przez niniejszego użytkownika
» 2014-07-01 13:40:26
Ja nie mogę, ale głupi błąd zrobiłem. Wygląda na to, że program obliczał wszystko dobrze. Błąd zrobiłem przy samym wyświetlaniu wyników z tablicy, wychodziło poza obszar...

I takie pytanie w nawiązaniu do sprawdzania, czy liczba się wczytała dobrze, czyli w tym przypadku:
C/C++
while( plik >> a )
{
    /...
}

Czy można w ten sam sposób postępować gdy wczytujemy łańcuchy znaków czy pojedyncze litery, aby sprawdzić czy wszystko dobrze się wczytało?
P-113030
Jacob99
» 2014-07-01 13:44:36
Tak. To jest ogólna metoda sprawdzania, czy wczytało się wszystko.
Można dodatkowo sprawdzić strumień warunkiem
while( plik >> a && !plik.fail() )
P-113032
pekfos
» 2014-07-01 13:51:43
Można dodatkowo sprawdzić strumień warunkiem
C/C++
while( plik >> a && !plik.fail() )
Nie ma potrzeby ani sensu.
P-113034
« 1 » 2
  Strona 1 z 2 Następna strona