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

Błąd w zadaniu.

Ostatnio zmodyfikowano 2009-02-07 10:27
Autor Wiadomość
celi1962
Temat założony przez niniejszego użytkownika
Błąd w zadaniu.
» 2009-02-05 22:42:22
Mam napisać program znajdujący dla danej liczby "n" (gdzie 1<n<10) pierwszą n-dziesiątkę liczb naturalnych wśród których nie ma liczby pierwszej (jeśli podam wybiorę liczbę 5 to mam otrzymać 50 kolejnych liczb złożonych dla n>5, czyli 6,8,9,i.t.d
jeśli podam 2 to mam otrzymać 20 kolejnych liczb złożonych dla n>2, czyli 4,6,8,9 i.t.d.
Proszę o pomoc nie potrafię sobie z tym poradzić wcześniej zrozumiałam zadanie trochę inaczej, a mianowicie (jeśli n=5 to ma znaleźć wśród pięćdziesięciu kolejnych liczb naturalnych takie liczby, które nie są liczbami pierwszymi).
Zadanie zrobiłam tak z pomocą kolegi na forum próbowałam tu trochę zmieniać i nawet pokazuje liczby większe od zadanego n ale nie pokazuje ich n-tkę.Proszę o pomoc mam ostatni termin zaliczenia.
C/C++
#include <iostream>
#include <cstdio>
#include <cmath>

using namespace std;

int main()
{
    int i, j, zakres, n, b;
    cout << "Podaj gorny zakres: ";
    cin >> n;
    zakres = n * 10;
    bool * tablica = new bool[ zakres + 1 ];
   
    b = sqrt(( float ) zakres );
   
    for( i = 2; i < zakres + 1; i++ )
         tablica[ i ] = true;
   
    for( i = 2; i <= b; i++ )
    if( tablica[ i ] == true )
    for( j = i + i; j < zakres + 1; j = j + i )
         tablica[ j ] = false;
   
    cout << "Liczby, ktore nie sa pierwsze: " << endl;
    for( i = 1; i < zakres + 1; i++ )
    if( tablica[ i ] == false )
         cout << i << " ";
   
    cin.ignore();
    getchar();
    return 0;
}
P-4122
DejaVu
» 2009-02-06 05:02:49
C/C++
int ilosc = 0;
cout << "Liczby, ktore nie sa pierwsze: " << endl;
for( i = 1; i < zakres + 1; i++ )
{
    if( tablica[ i ] == false )
    {
        cout << i << " ";
        ilosc++;
    }
    if( ilosc >= zakres ) break;
   
}

/edit:
bool * tablica = new bool[ zakres + 1 ];
Wydaje mi się, że to będzie za mała tablica i za mało liczb. Przykładowo jeśli:
n = 2, to masz wypisać 20 liczb kolejnych (niepierwszych), większych od 2. Tymczasem Ty uzyskasz zakres 2..21, co daje 19 liczb i w tym jeszcze są liczby pierwsze, więc uzyskasz za mało liczb.
Moim zdaniem tablica powinna mieć rozmiar:
bool * tablica = new bool[ zakres * 2 + n ];
Powód jest prosty. Na 100% co druga liczba jest parzysta, a co za tym idzie nie jest liczbą pierszą a co za tym idzie to w zbiorze o rozmiarze zakres*2+n istnieje conajmniej (zakres*2+n)/2 liczb nie pierwszych, czyli zakres+n/2, czyli zawsze jest więcej niż potrzebujesz wypisać.
P-4123
DeBugger
» 2009-02-06 08:00:44
Hmm. Moze to głupi pomysł, ale możnaby użyć vectora do rozszerzania tablicy?
Wtedy by było bez problemu i możnaby znajdować te liczby do nieskończoności.
P-4124
celi1962
Temat założony przez niniejszego użytkownika
» 2009-02-06 23:17:20
Dzięki "manfred" za pomoc. Program śmiga ale wiele oznaczeń jest dla mnie niezrozumiałych.Mielismy może w tym semestrze ze 4 konkretne zajęcia na temat C++.
prowadzący prosi o dokładne wyjaśnienie krok po kroku co wszystko oznacza.
Jeśli mógłbyś rzucić okiem na moje poprawki zasugerowane przez pana PIOTRA.
Niestety nie podaje właściwych liczb.
Proszę o pomoc!!!!
Podaję kod po poprawkach
C/C++
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int main()
{
    int i, j, zakres, n, b;
    cout << "Podaj liczbe naturalna:" << endl;
    cin >> n;
    zakres = n * 10;
    bool * tablica = new bool[ zakres * 2 + n ];
   
    b = sqrt(( float ) zakres );
   
    for( i = 2; i < zakres * 2 + n; i++ )
         tablica[ i ] = true;
   
    for( i = 2; i <= b; i++ )
    if( tablica[ i ] == true )
    for( j = i + i; j < zakres * 2 + n; j = j + i )
         tablica[ j ] = false;
   
    int ilosc = 0;
    cout << "Liczby, ktore nie sa pierwsze:" << endl;
    for( i = 1; i < zakres * 2 + n; i++ )
    {
        if( tablica[ i ] == false )
        {
            cout << i << " ";
            ilosc++;
        }
        if( ilosc >= zakres ) break;
       
    }
    cin.ignore();
    cout << "\n";
    cout << "\n";
    cout << "Wcisnij Enter zeby zakonczyc!!!!!!!";
    getchar();
    return 0;
}
P-4139
DejaVu
» 2009-02-07 04:37:25
Jeśli chcesz znaleźć liczby pierwsze to proponuję zastosować Sito Eratostenesa
P-4140
manfred
gotowiec
» 2009-02-06 14:37:58
C/C++
#include <iostream>
#include <cmath>

using namespace std;

int main()
{
    cout << "Podaj liczbe: ";
    int n;
    while( !( cin >> n ) ||( n > 9 || n < 2 ) )
    {
        cout << "Aha. To nie jest poprawna liczba. Sprobuj jeszcze raz." << endl;
        cin.clear();
        cin.sync();
    }
    n *= 20;
    n += 9;
    bool * arr = new bool[ n ];
    for( int i = 0; i < n; i++ )
    {
        arr[ i ] = false;
    }
    for( int i = 4; i < n; i += 2 )
    {
        arr[ i ] = true;
    }
    int s = static_cast < int >( sqrt( static_cast < double >( n ) ) );
    for( int i = 2; i < s; i++ )
    {
        if( !arr[ i ] )
        {
            int j = i * i;
            while( j < n )
            {
                arr[ j ] = true;
                j +=( i * 2 );
            }
        }
    }
    int j = 0;
    int foo =(( n - 9 ) / 20 );
    int bar = foo * 10;
    for( int i = foo; j < bar; i++ )
    {
        if( arr[ i ] )
        {
            cout << i << endl;
            j++;
        }
    }
    cin.sync();
    cin.get();
    delete[] arr;
}
P-18728
manfred
» 2009-02-07 10:27:58
A to ci wałek*, bowiem sitko można nieco zoptymalizować, a przykład masz w moim kodzie :D.

* - a może "ale wałek", bo jeszcze ktoś nie zrozumie...
P-18730
« 1 »
  Strona 1 z 1