Glückliche oder Traurige Zahl?

zooper  14.04.2022, 21:28

Wieso erstellst du eine Instanz der Main Klasse mit einer Methode in dieser Klasse um den Konstruktor aufzurufen der ein Programm ausführt? Sieht sehr komisch aus.

Fritziiiiii 
Fragesteller
 14.04.2022, 21:32

keine Ahnung hat mein Tutor im Studium mal so gemacht

3 Antworten

Ich hab mich auch mal dran versucht (in C#) und folgendes ist dabei herausgekommen:

internal class Program
{
    public static void Main(string[] args)
    {
        Console.WriteLine("Bitte geben Sie die untere Grenze ein: ");
        int start = int.Parse(Console.ReadLine());
        Console.WriteLine("Bitte geben Sie die obere Grenze ein: ");
        int end = int.Parse(Console.ReadLine());

        for (int i = start; i <= end; i++)
        {
            var sequence = new NumberSequence(i);
            if (sequence.IsLucky)
            {
                Console.WriteLine(sequence.StringRepresentation);
            }
        }
    }
}

internal class NumberSequence
{
    private readonly List<int> _numbers;
    
    public string StringRepresentation => string.Join(" -> ", _numbers);
    
    public bool IsLucky => _numbers[_numbers.Count - 1] == 1;

    public NumberSequence(int startNumber)
    {
        _numbers = new List<int>();
        ExpandSequence(startNumber);
    }

    private void ExpandSequence(int number)
    {
        if (_numbers.Contains(number)) return;
        _numbers.Add(number);
        ExpandSequence(SumOfSquaredDigits(number));
    }
    private int SumOfSquaredDigits(int number)
    {
        if (number == 0) return 0;
        int firstDigit = number % 10;
        return  firstDigit * firstDigit + SumOfSquaredDigits(number / 10);
    }
}

ACHTUNG: Die ExpandSequence-Methode fügt rekursiv Elemente zur Sequence hinzu, bis sich irgendwann eines wiederholen würde (ab da würde die Sequence sich periodisch wiederholen und in eine Endlos-Rekursion ausarten). Ich bin mir nicht sicher, ob die Rekursion immer terminiert, daher kann man zur Sicherheit auch die Iterationen mitzählen und irgendwann abbrechen (etwa so wie zooper in seiner/ihrer Lösung auch nur 100 Iterationen durchgeführt hat).

Ist eine nette kleine Aufgabe, daher geb ich auch mal meinen Senf dazu:

public class GluecklicheZahl {
	public static void main(String[] args) {
		Scanner scanner = new Scanner(System.in);
		
		// Unter- und Obergrenze abfragen
		System.out.print("Bitte geben Sie die Untergrenze ein: ");
		int lBound = scanner.nextInt();
		System.out.print("Bitte geben Sie die Obergrenze ein: ");
		int uBound = scanner.nextInt();
		scanner.close();
		
		// Jede Zahl zwischen Unter- und Obergrenze durchgehen
		for (int i = lBound; i <= uBound; ++i) {
			int num = i;
			Set<Integer> iterationResults = new LinkedHashSet<>();
			
			// Die Serie aufbauen
			// Da als Abbruchbedingung nur vorgegeben ist, dass die Serie irgendwann bei einer 1 enden soll,
			// wird als weitere Abbruchbedingung angenommen, dass die Serie sich ansonsten ab einem bestimmten Punkt wiederholt.
			// Daher wird die Schleife abgebrochen sobald ein Element eingefügt werden soll, welches schon in der Serie ist.
			while (num != 1 && !iterationResults.contains(num)) {
				iterationResults.add(num);
				num = Integer.toString(num).chars().map(Character::getNumericValue).map(value -> value * value).sum();
			}
			iterationResults.add(num);
			
			// Serie ausgeben, falls sie mit einer 1 geendet ist.
			if (num == 1) {
				System.out.println(iterationResults.stream().map(n -> n.toString()).collect(Collectors.joining(" -> ")));
			}
		}
	}
}

funktioniert nicht so ganz wenn ich es nur mit einer Zahl gemacht habe hat es funktioniert also im Konstruktor folgendes:

System.out.print("Zahl? ");

int zahl = scanner.nextInt();

createIntArray(zahl);

jetzt mit der schleife für den zahlenbereich net mehr wirklich. Bin auch dankbar für sonstige Anmerkungen wenn ihr das ganz anders gemacht hättet oder so