C++ Liczba doskonała


(system) #1
#include 

#include 


main()

{

int d,n;


cout << "Podaj liczbe: ";

cin >> n;

for (int i=1; d>=n; i++)

{

if (n%i==0) d=d+i;

}

if (d==n) cout << "Liczba doskonala."; else cout << "Liczba nie dosknala.";

getch();

}

Witam wie ktoś dlaczego ten program nie działa?? Według mnie wszystko jest dobrze a i tak 6 nie pokazuje jako liczby doskonałej. Prosił bym o pomoc w wskazaniu błędu.

Pozdrawiam


(Starkowski Dawid) #2

Podajesz n = 6.

W pętli masz d >= n. Ale po pierwszym wykonaniu pętli d = 1. Warunek nie jest spełniony, wychodzi z pętli.

Poza tym powinieneś wyzerować zmienną d przed użyciem. (nie krzyczy IDE, że używasz nie przypisanej zmiennej przy d = d+i?)


(system) #3

Ale jak zrobiłem tak:

#include 

#include 


main()

{

int d,n;


cout << "Podaj liczbe: ";

cin >> n;

for (int i=1; d<=n; i++)

{

if (n%i==0) d=d+i;

}

if (d==n) cout << "Liczba doskonala."; else cout << "Liczba nie dosknala.";

getch();

}

To dalej nie działa :frowning: Mógłby mi ktoś podać gotowy kod? -- Dodane 07.11.2010 (N) 15:25 -- nie krzyczy nic nowy ale dale nie działa z łatwiejszymi programami sobie dałem rady :frowning:

#include 

#include 


main()

{

int a,d,n;


cout << "Podaj liczbe: ";

cin >> n;

d=0;

for (int i=1; d<=n; i++)

{

if (n%i==0) d=d+i;

}

if (d==n) cout << "Liczba doskonala."; else cout << "Liczba nie dosknala.";

getch();

}

(Spam) #4

http://ideone.com/nOire


(Ob Serwator) #5

Witam.

Musisz zmienić warunek w pętli for:

Dałeś:

for (int i=1; d<=n; i++) {}

mamy w pewnym momencie (przy i = 3):

d = 1+2+3 = 6;

a warunkiem wykonywania pętli jest, że d<= n, a n jest właśnie liczbą 6, stąd pętla zrobi jeszcze jeden obieg, zwiększy i do 4, doda 4 do d (d = 10) i wtedy dopiero zakończy działanie. Potem sprawdza, czy d = 10 jest równe n = 6 i wykaże, że nie, stąd wynika, że 6 nie jest liczbą doskonałą. Gdyby była nierówność d < n, pętla skończyłaby obieg na i = 3 i wszystko byłoby w porządku.

Tak więc winno być:

for (int i=1; d < n; i++) {}

Przy okazji - powinno się robić odpowiednie wcięcia w celu poprawienia czytelności kodu. Nawet najkrótszych. I zmienna a nie jest do niczego potrzebna. Ale to już drobiazg.

Pozdrawiam.