Sprawdzanie czy podana liczba jest doskonala

0

Program, który sprawdza, czy podana liczba naturalna jest doskonała. Chcę wykorzystać metodę statyczną zwracającą wartość typu boolean. Napisałem program, kompiluje się, aczkolwiek wyświetla błędny rezultat np że 28 nie jest liczbą doskonała, a to błąd.

import java.util.Scanner;

public class LiczbaDoskonala {

	static int odczytajLiczbe() {
		Scanner odczyt = new Scanner(System.in);
		return odczyt.nextInt();
	}

	static boolean sprawdzLiczbeDoskonala(int liczba) {

		int suma = 0;

		for (int i = 1; i <= i / 2; i++) {
			if (liczba % i == 0)
				suma += i;
		}
		if (suma == liczba) {
			return true;

		} else {
			return false;
		}

	}

	public static void main(String args[]) {
		int liczba;
		System.out.print("Podaj liczbe naturalna ktora chcesz sprawdzic: ");

		liczba = odczytajLiczbe();

		if (sprawdzLiczbeDoskonala(liczba))
			System.out.println("Podana liczba jest doskonala");

		else
			System.out.println("Podana liczba nie jest doskonala");

	}

}
1

Twój algorytm jest zupełnie bez sensu. Przecież z definicji masz sumować tylko dzielniki które są liczbami pierwszymi a ty sumujesz wszystkie dzielniki. Różnica jak między krzesłem a krzesłem elektrycznym. Choćby dla tego twojego 28 sumujesz sobie wesoło 2, 4, 14 podczas gdy 2 jest jedyną parzystą liczbą pierwszą.
Teraz pozostaje tylko pytanie:

  1. Czy nie rozumiesz polecenia?
  2. Czy nie rozumiesz definicji liczb doskonałej?
  3. Czy nie rozumiesz kodu który napisałeś?</del>
1
Shalom napisał(a):

Przecież z definicji masz sumować tylko dzielniki które są liczbami pierwszymi a ty sumujesz wszystkie dzielniki

cyt:
Liczba doskonała to taka liczba, która jest równa sumie wszystkich swoich dzielników mniejszych od niej samej.
W definicji nic nie ma, że muszą to być dzielniki, które są liczbami pierwszymi.
Przykład 28 = 14 + 7 + 4 + 2 + 1

Źródło:
http://www.math.edu.pl/liczby-doskonale

0

Jak napisał @woolfik masz sumować wszystkie dzielniki mniejsze od danej liczby, a nie tylko te, które są mniejsze od swojej połowy (takich jest bardzo mało ;)).

        for (int i = 1; i < liczba; i++) {
            if (liczba % i == 0)
                suma += i;
        }
1

Moim zdaniem ta

for (int i = 1; i <= i / 2; i++) 

linijka powinna wyglądać tak for (int i = 1; i < liczba; i++)

. Ideone tego kodu nie przepuszcza więc nie sprawdzę.
0

Dziękuję bardzo wszystkim za odpowiedź, zmodyfikowałem kod i już chodzi bardzo dobrze!

import java.util.Scanner;

public class LiczbaDoskonala {

	static int odczytajLiczbe() {
		Scanner odczyt = new Scanner(System.in);
		return odczyt.nextInt();
	}

	static boolean sprawdzLiczbeDoskonala(int liczba) {

		int suma = 0;

		for (int i = 1; i < liczba; i++) {
            if (liczba % i == 0)
                suma += i;
        }
		
		if (suma == liczba) {
			return true;

		} else {
			return false;
		}

	}

	public static void main(String args[]) {
		int liczba;
		System.out.print("Podaj liczbe naturalna ktora chcesz sprawdzic: ");

		liczba = odczytajLiczbe();

		if (sprawdzLiczbeDoskonala(liczba))
			System.out.println("Podana liczba jest doskonala");

		else
			System.out.println("Podana liczba nie jest doskonala");

	}

}


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