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

Wysypywanie programu dla dużych liczb

Ostatnio zmodyfikowano 2017-03-12 15:16
Autor Wiadomość
nikusek007
Temat założony przez niniejszego użytkownika
Wysypywanie programu dla dużych liczb
» 2017-03-12 13:36:44
Witam!
Pisałem program, którego zadaniem było wypisanie wszystkich liczb mniejszych równych od liczby wczytanej w taki sposób, żeby żadne liczby obok siebie nie różniły się o 1
Np.
wczytane - 4
wypisuje - 2 4 0 3 1
Próbowałem do tego podejść na dwa sposoby, lecz dla obu program wysypuje się dla liczb większych od 520590, a dziedziną liczby wpisanej jest 0<=n<=10^6. Próbowałem stosować "unsigned" itd ale nie zmieniło się to ani trochę. KODY:
C/C++
#include <iostream>

using namespace std;

int main()
{
    int a, d = 1;
    cin >> a;
    int b[ a + 1 ];
    if( a == 0 ) cout << 0;
    else if( a < 3 ) cout << "NIE";
    else if( a == 3 )
         cout << 2 << " " << 0 << " " << 3 << " " << 1;
    else {
        for( int i = 0; i <= a; i++ )
             b[ i ] = i;
       
        if((( a + 1 ) % 3 == 0 ) &&(( a + 1 ) % 5 == 0 ) )
        {
            for( int j = 0; j <= a; j++ )
            { cout << " " << b[ d %( a + 1 ) ];
                d = d + 4; }
        }
        else if(( a + 1 ) % 3 == 0 )
        {
            for( int j = 0; j <= a; j++ )
            { cout << " " << b[ d %( a + 1 ) ];
                d = d + 5; }
        }
        else {
            for( int j = 0; j <= a; j++ )
            { cout << " " << b[ d %( a + 1 ) ];
                d = d + 3; }
        } }
    return 0;

_______________________________________________________________________

C/C++
#include <iostream>

using namespace std;

int main()
{
    int a, d = 1;
    cin >> a;
    int b[ a + 1 ];
    if( a == 0 ) cout << 0;
    else if( a < 3 ) cout << "NIE";
    else if( a == 3 )
         cout << 2 << " " << 0 << " " << 3 << " " << 1;
    else {
        for( int i = 0; i <= a; i++ )
             b[ i ] = i;
       
        while( d < a ) {
            cout << " " << b[ d ];
            d = d + 2; }
        d = 0;
        while( d < a )
        { cout << " " << b[ d ];
            d = d + 2; } }
    return 0;
}
P-158916
carlosmay
» 2017-03-12 13:42:59
520590
Kończy ci się pamięć stosu i wywala aplikację.
W tej sytuacji musisz dynamicznie przydzielić pamięć dla tablicy.

C/C++
cin >> a;
int b[ a + 1 ];
Takie deklarowanie tablicy jest niezgodne ze standardem C++.
Rozmiar tablicy musi być znany w czasie kompilacji (innymi słowy, musi być
constexpr
).

edit: Zamiast literek stosuj opisowe nazwy zmiennych.
Stosuj klamry nawet dla pojedynczej instrukcji w pętli, czy instrukcji warunkowej itd.
P-158918
nikusek007
Temat założony przez niniejszego użytkownika
» 2017-03-12 13:48:59
Okkkejj...no to jeszcze chyba trochę nauki przede mną. Do programu więc wrócę za jakiś czas, jak już wiedza teorytyczna będzie troszkę większa. Dziękuję za odpowiedź! ;)
P-158920
carlosmay
» 2017-03-12 13:49:57
P-158921
nikusek007
Temat założony przez niniejszego użytkownika
» 2017-03-12 13:58:48
No i zabieramy się do zabawy. Dziękuję Ci jeszcze raz! ;)
P-158922
pekfos
» 2017-03-12 14:14:47
Po co ta tablica?
C/C++
for( int i = 0; i <= a; i++ )
     b[ i ] = i;
Indeks tablicy jest równy wartości. Masz już potrzebną wartość, ale mimo to chcesz ją obliczyć marnując przy tym czas i pamięć. Czy przypadkiem nie powinieneś oszczędzać tych zasobów, pisząc zadanie na SPOJa..?
P-158923
nikusek007
Temat założony przez niniejszego użytkownika
» 2017-03-12 14:51:37
OK program przestało wywalać po zastosowaniu vectora

Wspominano mi już o tym problemie, lecz nie miałem pomysłu w jaki sposób to inaczej zastosować, ponieważ po ominięciu tego elementu program zupełnie mi nie chciał działać :/

SPOJ niestety nie zaakceptował ani jednego, ani drugiego kodu. Problemem mogą być spacje między nimi, lecz nie wiem w jaki sposób to zrobić, żeby "na zewnątrz liczb" (|<->2 4 0 3 1<->|) nie było spacji. 
EDIT:
Problemem nie są spacje, ponieważ wypisałem pierwszy wyraz przed pętlą, tak, że już nie powinno być spacji "na zewnątrz", a dalej nie działa :/
EDIT 2:
Problemem były spacje i warunek w while'u. Zaakceptowało! :D
Dziękuję, przynajmniej poznałem też vectory! Teraz już nic mnie nie powinno powstrzymać przed zarobieniem pierwszego miliona!
P-158925
pekfos
» 2017-03-12 15:00:05
wypisanie wszystkich liczb mniejszych równych od liczby wczytanej w taki sposób, żeby żadne liczby obok siebie nie różniły się o 1
Jakoś nie wierzę, że tak brzmi treść tego zadania. Możesz podać, co dokładnie masz zrobić?
P-158926
« 1 » 2
  Strona 1 z 2 Następna strona