ZADANIE C++ w Codeblocks
Napisz program, który pobierze ze standardowego wejścia liczę naturalną, następnie na standardowym wyjściu napisze czy jest ona liczbą doskonałą czy nie. Program ma wypisać odpowiedź tak lub nie.
Podpowiedź 1
Liczba doskonała - liczba naturalna, która jest sumą wszystkich swych dzielników mniejszych od niej samej.
Najmniejszą liczbą doskonałą jest 6 , ponieważ 6 = 3 + 2 + 1
Podpowiedź 2
W zadaniu trzeba wyznaczyć sumę dzielników liczby. Można to zrobić deklarując zmienną s , która będzie przechowywać wartość sumy dzielników. Zmiennej s na początku przypisujmy wartość zero. Ważne jest, by zmienną s zadeklarować i przypisać jej początkową wartość przed pętlą, w której będziemy szukać dzielników. Następnie, gdy znajdziemy kolejny dzielnik, dodajemy go do zmiennej s . Po znalezieniu wszystkich dzielników zmienna s będzie zawierała ich sumę.
Przykład 1
Dane:
6
Wynik:
tak
Przykład 2
Dane:
7
Wynik:
nie
UWAGA: przesłany plik *.cpp musi zawierać własne komentarze opisujące znaczenie poszczególnych bloków programu. Komentarze te mają wyjaśniać, w jaki sposób rozwiązujesz dane zadanie.

Program nie wypisuje żadnych komunikatów wejścia-wyjścia, nie zatrzymuje się w oczekiwaniu na żadną interakcję, jedynie: dane-wynik. Nie używaj więc instrukcji np. "pause", nie stosuj zewnętrznych bibliotek, nie wprowadzaj komunikatów w stylu "Podaj liczbę" itp.

1

Odpowiedzi

Najlepsza Odpowiedź!
2009-12-06T20:14:39+01:00
#include <cstdio>

int main() {
long long n; // w tej zmiennej trzymamy wczytana liczbe
scanf("%lld", &n); // wczytujemy liczbe

long long sum = 1; // suma znalezionych licznikow
// sum jest na poczatek rowne 1, bo 1 jest pierwszym dzielnikiem liczby n (tak jest zawsze)

// dzielnikow szukamy w petli, zaczynamy od 2
// jak już znajdziemy dzielnik i, to wtedy n/i rowniez jest dzielnikiem
// dlatego wystarczy, ze petla bedzie szukac tylko po mniejszych dzielnikach - wieksze bedziemy miec automatycznie, jak tylko znajdziemy mniejszy dzielnik
for (int i=2; i*i <= n; ++i) {
// sprawdzamy, czy i jest dzielnikiem n
if (n % i == 0) {
// i jest dzielnikiem - dodajemy go do sumy
sum += i; // dodajemy znaleziony dzielnik i
// tutaj dodajemy drugi dzielnik, ale tylko wtedy...
// gdy i*i <> n - bo jeśli i*i=n, to wtedy drugi dzielnik, czyli n/i jest równy i - a i już dodaliśmy
if (i*i != n)
sum += n/i; // oraz odpowiadajacy mu dzielnik, czyli n/i
}
// tutaj usprawnienie - jak aktualna suma jest większa od n
// to juz w tym miejscu wiemy, że n nie jest doskonale
// i mozemy przerwac petle
if (sum > n) {
break;
// przerywamy, jesli aktualna suma przewyzsza dana liczbe
}
}

// tutaj sprawdzamy, czy suma jest równa n
if (sum == n)
printf("tak\n");
else
printf("nie\n");
return 0;
}
2 2 2