Program liczący liczby doskonałe - gdzie jest błąd?

0

Jako ćwiczenie zrobiłem program liczący "Liczby doskonałe" (Liczba doskonała to liczba, która jest sumą wszystkich swoich dzielników).
Program miał sprawdzać zbiór liczb i wyświetlać na ekranie tylko te liczby, które są "doskonałe".
ii.. natrafiłem na bug.

Zamiast pokazywać się na ekranie:

6
28
...

To jest wyświetlane:

6
14
...

I nie wiem dlaczego tak, no :<
Byłbym wdzięczny za wytłumaczenie co zrobiłem źle, poprawienie mojego kodu itd...

Kod źródłowy:

#include <iostream>

using namespace std;

int x=0 n, z, i, dziel[100], sum=0, y, kk;
int main()
{
   for(kk=0;kk<50;kk++){
    n=0; // numer tablicy
    sum=0;
    y=0; //numer tablicy

    x++;

    for(i=1;i<x;i++){
    z = x%i;
    if(z==0)
    {
    dziel[n] = i;
    n++;
    }

                    }
    for(y=0;y<=n;y++){   //Sprawdzanie czy liczba jest doskonala
    sum = sum + dziel[y];
                     }
    if(sum==x)
    {
        cout<<x<<endl;
    }
    
       }
    return 0;
}
0

Dlaczego nikt nie odpowiada w moim wątku? w szczególności punkt o wcięciach

0

Zmień w ostatnim forze z <= na <.

0

Ja bym zamienił tablicę dziel[100] na vektor, bo przy następnej liczbie, tablica nie jest wyczyszczona i może mieć stare dane, w ogóle vector się lepiej nadaje albo lista i też nie potrzebnie zera dodajesz jeśli akurat jest tablica wyzerowana.

0

Jak nie musisz nie używaj zmiennych globalnych. A w tym programie nie musisz.
W C++ możesz zmienną iteracyjną inicjować w momencie tworzenia pętli:

for (int i=0; i<x; i++)

Jeśli zwrócisz uwagę na zasięg zmiennej, to zauważysz, że nie potrzeba Ci tylu zmiennych iteracyjnych. Poprawnie (i czytelniej, bo masz mniejszą ilość zmiennych) jest też tak:

for (int i=0; i<x; i++)
{ }
for (int i=0; i<n; i++)
{ }

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