1 / 5
Mar 2017

`#include

using namespace std;

int main()
{
int ile_obiegow;
int n = 0;
int ile_liczb;

int *wyniki = new int [ile_obiegow];

cin >> ile_obiegow;

while (n < ile_obiegow)
{
    cin >> ile_liczb;
    int *liczby = new int [ile_liczb];

    for (int i = 0; i < ile_liczb; i++)
    {
        cin >> liczby[i];
        wyniki[n] += liczby[i];
    }


    n++;
}

for (int i = 0; i < ile_liczb; i++)
{
    cout << wyniki[i] << endl;
}


return 0;

}

`
Zastanawia mnie dlaczego sędzia tego nie akceptuje, choć u mnie działa :expressionless:

  • created

    Mar '17
  • last reply

    Mar '17
  • 4

    replies

  • 1.4k

    views

  • 2

    users

  • 1

    link

Ilość liczb na wejściu jest nieokreślona. Więc w szczególności poniższy
fragment kodu jest błędny:

cin >> ile_obiegow;

Liczby powinny być wczytywane aż do końca wejścia. Zakładając że na wejściu są
same liczby można to zrobić następująco:

int liczba;
while (cin >> liczba) {
  ...
}

Dodatkowo, poprzez wypisywanie sum częściowych wraz z wczytywaniem kolejnych
liczb można uniknąć przechowywania wszystkich liczb w pamięci.

Popełniłem błąd - chodzi mi o zadanie proste dodawanie RNO_DOD

Odwrotna kolejność operacji:

int *wyniki = new int [ile_obiegow]{};
cin >> ile_obiegow;

Dodatkowo tablica wyniki jest niezaincjalizowana przed pierwszym użyciem.

Napisanie "new int[n];" wykonuje default-initialization, co w przypadku typu
int oznacza że wartość jest nieokreślona. Zamiast tego można napisać "new
int[n]();" co wykonuje value-initialization co w przypadku typu int oznacza że
wartość będzie równa zero.

Dziękuję za odpowiedź, bo też się przydała. Główny błąd polegał na tym że w końcowej pętli wyświetlającej wynik, zamiast
i < ile_obiegow
' było
i < ile_liczb
:wink:.

Suggested Topics

Topic Category Replies Views Activity
System SPOJ 1 185 Jan 30
System SPOJ 2 127 Apr 15

Want to read more? Browse other topics in System SPOJ or view latest topics.