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.
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; }
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;
}