Sumy częściowe, powtórzenie wyrazów, zła odp. (zad. z MAIN)

0

Witam.

Program ma za zadanie znaleźć wśród ciągu sum częściowych danego ciągu pierwszy taki wyraz, który pojawia się co najmniej drugi raz. Pełna treść: main.edu.pl/pl/user.phtml?op=showtask&task=scz2&con=PAS

Oto, co napisałem:

#include <iostream>
using namespace std;

#define MAX 20000

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    
    int a[MAX];
    unsigned short n = 0;
    char c = c; // tylko do pomocy przy sprawdzeniu, czy juz wzisniety zostal enter
    for(unsigned short i = 0; i < MAX; i++)
    {
                 cin >> a[i];
                 if ((c = cin.get()) == '\n')
                 {
                        n = i + 1;
                        break;
                 }
                 else cin.unget();
    } 
    
    int *s_cz = new int[n];
    
    s_cz[0] = a[0]; // pierwsze wyrazy sie pokrywaja
    
    bool czy_znalazl = false;
    int suma_powtorzona = 0;
    for(unsigned short i = 1; i < n; i++)
    {
                 s_cz[i] = s_cz[i-1] + a[i]; // tworzymy kolejna sume czesciowa
                 
                 for(unsigned short j = 0; j < i; j++) // sprawdzamy, czy juz sie kiedys pojawila taka sama
                 {
                              if(s_cz[i] == s_cz[j])
                              {
                                         suma_powtorzona = s_cz[i];
                                         czy_znalazl = true;
                                         break;
                              }
                 }
                 if(czy_znalazl) break;
    }
    if(czy_znalazl) cout << suma_powtorzona;
    else cout << "brak";
    
    delete [] s_cz;  
} 

MAIN'owa sprawdzarka daje 40 punktów na 100 i komunikat: "zła odpowiedź".
Mam problem ze znalezieniem błędu...
Z góry dziękuję za pomoc.

0

Pozwolę sobie odkopać.
Ściągnąłem testy MAIN'owe i zacząłem ręcznie sprawdzać, gdzie mój program się sypie.
Być może nie powinno mnie to dziwić, ale przy testach, w których jest bardzo dużo liczb (tj. prawie tyle, ile górna granica MAX=20 000) program daje błędne odpowiedzi, natomiast w przypadku mniejszej liczby liczb, jest OK. Zatem sam algorytm jest chyba w porządku? Więc gdzie może leżeć przyczyna problemu?

0

Być może przekraczasz zakres, dla dużej ilości składników suma częściowa nie mieści się w typie int.

0

Zacznij od uproszczenia swojego programu, np coś w tym stylu:

#include <iostream>
#include <iomanip>
using namespace std;
 
const int MAX=20000;
 
int main()
  {
   int tb[MAX],*p=tb;
   unsigned n=0;
   while(n=0;cin.peek()!='\n';++n)
     {
      cin>>ws>>tb[n];
      if(n)
        {
         int s=(tb[n]+=tb[n-1]);         
         for(unsigned i=0;i<n;++i)
           {
            if(tb[i]==s)
              {
               cout<<s;
               return 0;
              }
           }
        }
     } 
   cout<<"brak";
   return 0;
  }

A nawet to można jeszcze uprościć, zauważ że im mniej kodu tym łatwiej znaleźć błąd.

0

Cóż... widać, że po prostu przyjąłeś inną strategię na rozwiązanie problemu i Twój program działa bezbłędnie.
Jednak nadal nie wiem, co jest nie tak z moim (@bo - zakres jest w porządku, zwłaszcza, że u @_13th_Dragon też mamy int'y i działa)
Przy okazji jeszcze mam pytanie: dlaczego w pętlach dokonujesz preinkrementacji, a nie postinkrementacji?

1 użytkowników online, w tym zalogowanych: 0, gości: 1