Prüfen ob Zahl als Summe von Potenzen dargestellt werden kann.

QED-777

Mitglied
Hallo alle zusammen,

ich soll prüfen, ob eine beliebige Zahl mit Zahl = a^4 + b^3 + c^2 dargestellt werden kann.
Mein Code funktioniert selbstverständlich nicht.
Ich glaube, dass ich a, b und c als beliebige Zahlen definieren muss also dass diese keinen festen Wert haben dürfen nur leider weiß ich nicht wie.

Was ich bisher gemacht habe:

public static boolean istSummeVonPotenzen(long n)
{
long a;
long b;
long c;

if(n == (a^4) + (b^3) + (c^2))
{
return true;
}
else
{
return false;
}

}
 
K

kneitzel

Gast
Du hast jetzt schon einmal einen Check, ob bestimmte Werte dies erfüllen.

Nun kannst Du Dir überlegen, ob Du nicht einfach alle möglichen Kombinationen ausprobieren kannst.

Was für Ideen hast Du denn, wenn es zu einem einfachen ausprobieren aller Möglichkeiten geht?
 

httpdigest

Top Contributor
Mein Code funktioniert selbstverständlich nicht.
Selbstverständlich. :)

Also, eine Programmiersprache ist kein Computer-Algebra-System. Eine Variable muss irgendwann einmal einen konkreten Wert haben. Der Wert kann sich natürlich dynamisch zur Programmausführung ändern. Die Aufgabe verlangt höchstwahrscheinlich von dir, dass du mit einer Schleife einfach ein paar sinnvolle mögliche Kombinationen/Bereiche der ganzen Zahlen für a, b und c ausprobierst und prüfst, ob für _konkrete_ Werte für a, b und die Gleichung erfüllt ist.

Desweiteren: In Java ist ^ nicht der Potenzierungsoperator (den gibt es nicht in Java).
 

QED-777

Mitglied
Danke für die Hilfe, an alle. 🙏

Selbstverständlich. :)

Also, eine Programmiersprache ist kein Computer-Algebra-System. Eine Variable muss irgendwann einmal einen konkreten Wert haben. Der Wert kann sich natürlich dynamisch zur Programmausführung ändern. Die Aufgabe verlangt höchstwahrscheinlich von dir, dass du mit einer Schleife einfach ein paar sinnvolle mögliche Kombinationen/Bereiche der ganzen Zahlen für a, b und c ausprobierst und prüfst, ob für _konkrete_ Werte für a, b und die Gleichung erfüllt ist.

Desweiteren: In Java ist ^ nicht der Potenzierungsoperator (den gibt es nicht in Java).
Also, ich habe es jetzt mit einer Schleife versucht. Und wie du schon richtig vermutet hast, sind auf meinem Übungsblatt einige Werte für die die Gleichung erfüllt ist. Für n = 3 wird mir ein true angezeigt, jedoch nicht für n = 6. Und sehr wahrscheinlich liegt es daran, dass nicht schrittweise meine Variablen um 1 gekürzt werden, sondern alle gleichzeitig 😅
Ich habe auch an etwas wie " a-- || b-- || c-- || a-- && b-- || a-- && c-- || b-- && c-- " gedacht, da ich so jede Möglichkeit durchgehen würde (falls ich mich nicht irre), nur weiß ich hier nun auch nicht wie ich das eintippen kann ohne dass Java meckert.

Geht das ganze überhaupt in die richtige Richtung ?


public static boolean istSummeVonPotenzen(long n)
{
long a = 10;
long b = 10;
long c = 10;

while( n != (a*a*a*a) + (b*b*b) + (c*c))
{
a--;
b--;
c--;
}
if(n == (a*a*a*a) + (b*b*b) + (c*c))
{
return true;
}
else
{
return false;
}
}
 

Blut1Bart

Bekanntes Mitglied
Mh, so vielleicht? Bin mit aber ganz unsicher, ob das richtig ist....

Java:
import java.util.Arrays;

public class Main1 {
    private static long test(int[] a) {
        return (long) a[0] * a[0] * a[0] * a[0] + (long) a[1] * a[1] * a[1] + (long) a[2] * a[2];
    }

    public static boolean istSummeVonPotenzen(long n) {
        int[] a = {0, 0, 0};
        for (int i = 0; i < 3; i++) {
            a[i] = (int) Math.ceil(Math.pow(Integer.MAX_VALUE, 1.0 / (4 - i)));
            while (a[i] / 2 > 0 && test(a) > n) {
                a[i] /= 2;
            }
            if (test(a) == n) {
                System.out.println(Arrays.toString(a));
                return true;
            }
            a[i] *= 2;
            while (test(a) > n) {
                a[i]--;
            }
            if (test(a) == n) {
                System.out.println(Arrays.toString(a));
                return true;
            }
        }
        return false;
    }

    public static void main(String[] args) {
        System.out.println(istSummeVonPotenzen(16));
        System.out.println(istSummeVonPotenzen(28));
        System.out.println(istSummeVonPotenzen(27));
        System.out.println(istSummeVonPotenzen(29));
        System.out.println(istSummeVonPotenzen(714));
    }
}

... denn es sollte ja für alle Zahlen funktionieren...
 

Jw456

Top Contributor
Ist das wirklich so das alle drei Variablen immer den gleichen Wert haben. Wenn das so gemeint ist. Würden es bestimmt nicht drei Variablen sein.

Edit dieser Hinweis bezieht sich auf den Code von dem TE
 
K

kneitzel

Gast
Also generell gibt es hier mehrere Ansätze:
a) Man kann es so betrachten wie bei den Zahlen selbst: Da hast Du Ziffern und immer wenn es einen Überlauf gibt, wird die nächste Ziffer hochgezählt und es wird bei 0 angefangen. Also 0 0 0, 0 0 1, 0 0 2, .. 0 0 9 => 0 1 0
Wird hier nur komplexer, da der Zahlenbereich unbekannt ist. Überlauf wäre hier, wenn die Gleichung > dem Wert ist.

b) Man kann es einfach als verschachtelte Schleifen betrachten. Dann muss man nur schauen, bis zu welchem Wert welche Schleife rechnen muss. Das geht zur Not über einfache Umstellungen der Formel.
 

Blut1Bart

Bekanntes Mitglied
a) Man kann es so betrachten wie bei den Zahlen selbst: Da hast Du Ziffern und immer wenn es einen Überlauf gibt, wird die nächste Ziffer hochgezählt und es wird bei 0 angefangen. Also 0 0 0, 0 0 1, 0 0 2, .. 0 0 9 => 0 1 0
Wird hier nur komplexer, da der Zahlenbereich unbekannt ist. Überlauf wäre hier, wenn die Gleichung > dem Wert ist.
Das geht zwar, ist aber nicht Greedy, also nicht so performant. Sehr gefräßig zu sein, ist hierbei besser. ;)
 
K

kneitzel

Gast
Also erst einmal geht es um einen einfachen Ansatz incl. einer verständlichen Lösung.

Deine Lösung erachte ich als sehr unleserlich und ich bezweifle, dass der TE damit etwas anfangen kann

Und die vorgeschlagene Lösung lässt sich sehr gut optimieren durch das eliminieren der innersten Schleife. Das wäre dann aber eine Optimierung, die man später machen kann.
 

Blut1Bart

Bekanntes Mitglied
Deine Lösung erachte ich als sehr unleserlich
Ich bin mir gerade nicht sicher, ob eine Brille noch eine Linderung deiner Symptome herbeiführen kann... aber wahrscheinlich ist das Kind schon in den Brunnen gefallen.

Nochmal: Ich zwinge niemandem irgendetwas auf. Wie schlecht er es umsetzen möchte, das bleibt letztendlich dem TE überlassen.
 
K

kneitzel

Gast
Ich interpretiere Dein Post so, das Du ernsthaft deinen Code für gut und leserlich hältst. Das ist interessant aber wird von mir auf Grund Deiner Entgleisung schlicht nicht weiter diskutiert.
 

httpdigest

Top Contributor
Eine Sache, die sowieso erstmal vorher geklärt werden muss, bevor man sich an eine Lösung der Aufgabe macht, ist, ob `b` negativ sein darf. In den Posts des TE steht bisher kein Hinweis dazu.
Bei `a` und `c` ist es natürlich aufgrund der geraden Potenz egal, nicht aber bei `b`.
 

Blut1Bart

Bekanntes Mitglied
ist, ob `b` negativ sein darf
Ich ging jetzt von der Menge der natürlichen Zahlen aus... Anderes macht für mich nur bedingt sinn.

Integer.MAX_VALUE
das gefällt mir noch nicht, da müsste eigentlich Long.MAX_VALUE stehen, falls jemand auf die Idee kommt und dort eine Zahl >= 2³¹ reinschmeißt...

Und von kneitzel hätte ich ganz gerne eine bessere Lösung gesehen, er sagt ja meine sei schlecht.
 

httpdigest

Top Contributor
Ich ging jetzt von der Menge der natürlichen Zahlen aus... Anderes macht für mich nur bedingt sinn.
Warum macht alles andere für dich keinen Sinn?
Für 4 = a^2 + b^3 + c^4 gibt es eben die Lösungsmenge:
{a = -2, b = -1, c = +/- 1}
{a = +/-2, b = 0, c = 0}
{a = 2, b = -1, c = +/- 1}
https://www.wolframalpha.com/input/?i=solve+4=a^2+b^3+c^4+for+a,b,c+integer

Es gibt keinen besonderen Grund, das auf natürliche Zahlen einzuschränken, es sei denn, die Aufgabenstellung verlangt das (was wir eben nicht wissen). Und beliebige Annahmen zu treffen und damit einfach "vorzupreschen" macht eben keinen Sinn.
 

Blut1Bart

Bekanntes Mitglied
Und beliebige Annahmen zu treffen und damit einfach "vorzupreschen" macht eben keinen Sinn
Kennst du Ockhams Rasiermesser?
1. Von mehreren hinreichenden möglichen Erklärungen für ein und denselben Sachverhalt ist die einfachste Theorie allen anderen vorzuziehen.
2. Eine Theorie ist einfach, wenn sie möglichst wenige Variablen und Hypothesen enthält und wenn diese in klaren logischen Beziehungen zueinander stehen, aus denen der zu erklärende Sachverhalt logisch folgt.

Und 3 ich habe nicht versucht, "vorzusprechen", sondern einfach die für mich nächstliegendste Interpretation gewählt... War keine böse absicht.
 

httpdigest

Top Contributor
Ockhams Rasiermesser wird benutzt, um Erklärungen bzw. Theorien für Beobachtungen bzw. zu erklärende Sachverhalte in ihrer Wahrscheinlichkeit zu ordnen: Eine Theorie, die mehr Vermutungen benötigt, um eine Beobachtung bzw. einen Sachverhalt zu erklären, ist im Zweifel weniger korrekt als eine Theorie, die weniger Vermutungen anstellt, da die Vermutungen einer gewissen Wahrscheinlichkeit unterliegen. Oder kurz gesagt: Je mehr Vermutungen, desto wahrscheinlicher ist es, dass eine der getroffenen Vermutungen nicht eintritt und damit die Theorie inkorrekt werden lässt.

Dementsprechend würde sogar Ockhams Rasiermesser eher als Argumentation dienen, warum deine Vermutung darüber, dass die Aufgabenstellung nur natürliche Zahlen zulässt, mit einer größeren Wahrscheinlichkeit falsch ist.
Aber: Ockhams Rasiermesser kann man hier überhaupt nicht anwenden, denn es geht nicht darum, eine Theorie zu finden, um etwas (einen Sachverhalt oder eine Beobachtung) zu erklären, sondern es geht darum, eine Aufgabe zu lösen.

Lass uns doch einfach abwarten, was der TE dazu sagt. Es kann ja gut sein, dass in der Aufgabe stand, dass es nur natürlich Zahlen sind, in welchem Fall deine Lösung vielleicht eine Lösung wäre. Mein Punkt ist nur: Bis jetzt _wissen_ wir es nicht, sondern können nur _Vermutungen_ anstellen, die eventuell wahr oder falsch sind.
 

Blut1Bart

Bekanntes Mitglied
Da wird vom TE auch nichts mehr zu kommen. Entweder derjenige wollte nur eine Lösung abgreifen oder es war eine Trollfrage. 🤷‍♂️ Beides ist mir aber ziemlich unwichtig. 😊
 

QED-777

Mitglied
Da wird vom TE auch nichts mehr zu kommen. Entweder derjenige wollte nur eine Lösung abgreifen oder es war eine Trollfrage. 🤷‍♂️ Beides ist mir aber ziemlich unwichtig. 😊
Nee so ist das nicht 😅
Hab mich weiter mit beschäftigt und leider das Problem nicht lösen können. Stattdessen habe ich die anderen Aufgaben auf dem Übungsblatt bearbeitet.
Die Aufgabe, die hier besprochen wird, ist die einzige die mir fehlt und interessanter Weise ist die auch am anspruchsvollsten meiner Meinung nach.

Einer der Kommilitonen meinte, dass man hier 3 Schleifen bilden soll, was auch der Herr Kneitzel ungefähr mit seinem Vorschlag der Schleifen-Verschachtelung erwähnt hatte.
Mein Problem ist allerdings, dass ich absolut kein Durchblick habe und der Lösung einfach nicht näher komme.

Bis Montag habe ich ja noch Zeit, dann ist Abgabe. Bis dahin werde ich mir noch Gedanken machen und hoffentlich zu einer Lösung kommen. :)

Jedoch bin ich euch allen sehr dankbar, dass ihr euch die Zeit genommen habt mir Tipps zu geben.

PS:
Die Methode prüft zu einer natürlichen Zahlen, ob es natürliche Zahlen a,b und c gibt, die man eben als Summe von Potenzen darstellen kann.
 
K

kneitzel

Gast
Da als kleine Hinweise:

1) Die Formel x = a^4 + b^3 + c^2 kann man natürlich zu c umstellen. x wird gegeben, für a und b hat man die zwei verschachtelte Schleifen. c ließe sich dann ausrechnen.

2) Grenzen für a: Das größte a wäre, wenn b und c null sind. Daher kann man dann x = a^4 umstellen, so dass man ein a berechnet. => Obere Grenze für die äußere Schleife.

3) Grenze für b in der inneren Schleife: x = a^4 + b^3 kann man nach b umstellen und dann kann man ein b berechnen -> Obere Grenze für die innere Schleife.

Damit wird der Anspruch schon deutlich geringer. Der Anspruch ist also eher mathematischer Art als eben Java Kenntnisse gefordert werden.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Prüfen on eine Zahl im String enthalten ist Java Basics - Anfänger-Themen 3
sserio Prüfen, ob eine Zahl eine periodische Zahl ist Java Basics - Anfänger-Themen 20
K Warum gibt mir z. B. 40^128 eine Zahl? Ich dachte mit xor kann man nur booleanwerte erhalten, also prüfen ob etwas whar oder falsch ist? Java Basics - Anfänger-Themen 1
M Prüfen, ob Zeichen eine Zahl ist Java Basics - Anfänger-Themen 3
C Datentypen Prüfen of eine Zahl Quadratzahl ist Java Basics - Anfänger-Themen 2
N jnumberfield prüfen, ob eine Zahl eigegeben wurde Java Basics - Anfänger-Themen 12
T Prüfen, ob ein String eine Zahl ist Java Basics - Anfänger-Themen 10
D Int Zahl auf Negativität prüfen Java Basics - Anfänger-Themen 2
M Aufgabe: Array auf doppelte Zahl prüfen Java Basics - Anfänger-Themen 8
G Prüfen ob Zahl quadratfrei ? Java Basics - Anfänger-Themen 15
G Auf Zahl prüfen Java Basics - Anfänger-Themen 2
D Prüfen ob die Zahl nur bestimmte Nachkommastellen hat Java Basics - Anfänger-Themen 3
G Prüfen ob Zahl oder Buchstabe Java Basics - Anfänger-Themen 2
D Wie kann man in Java nach Arrays auf Duplikate prüfen Java Basics - Anfänger-Themen 12
J Schlüsselworte Prüfen, ob ein bestimmtes, ganzes Wort in einem String enthalten ist. Java Basics - Anfänger-Themen 6
Ostkreuz Int Scanner auf Enter Eingabe prüfen Java Basics - Anfänger-Themen 4
S Prüfen ob ein zweidimensionales Array rechteckig ist Java Basics - Anfänger-Themen 4
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
Fiedelbambu Prüfen von Komma stelle beim Taschenrechner Java Basics - Anfänger-Themen 5
I Auf vollen Monat prüfen? Java Basics - Anfänger-Themen 22
A Dateiname auf Vorkommen prüfen Java Basics - Anfänger-Themen 29
I Prüfen, ob Anzahl an Monate ein Jahr ergeben Java Basics - Anfänger-Themen 4
W Klasse existiert prüfen Java Basics - Anfänger-Themen 5
U Kann man bei Java gleich mehrere Bedingungen prüfen in der If, aber in einem "Satz"? Java Basics - Anfänger-Themen 1
O Ich ahbe einen char und diesen soll ich bei .matches prüfen, also ob der char in meiner Zeichenkette vorhanden ist, wie mache ich das? Java Basics - Anfänger-Themen 9
B Array nach Wert prüfen rekursiv Java Basics - Anfänger-Themen 5
G Strings auf Gleichheit prüfen - Aufgabe vom Prof. Java Basics - Anfänger-Themen 5
M Array auf Primzahlen prüfen Java Basics - Anfänger-Themen 7
K Wie String prüfen ob drei mal das gleiche Zeichen vorkommt? Java Basics - Anfänger-Themen 7
J ArrayList auf bereits vorhanden eintrag prüfen Java Basics - Anfänger-Themen 5
X Zwei Dimensionales Array prüfen Java Basics - Anfänger-Themen 1
B Prüfen, ob Zeit Überschreitung Java Basics - Anfänger-Themen 2
B Sudoku prüfen Java Basics - Anfänger-Themen 13
M Prüfen auf null ohne NPE Java Basics - Anfänger-Themen 1
X Array auf Leerstellen prüfen Java Basics - Anfänger-Themen 1
FelixN Prüfen, ob ein 2D-Array rechteckig ist Java Basics - Anfänger-Themen 42
C Erste Schritte JComboBox Einträge auf Duplikat prüfen Java Basics - Anfänger-Themen 4
M prüfen ob alle array werte gleich sind Java Basics - Anfänger-Themen 27
C Array auf Null-Inhalte prüfen Java Basics - Anfänger-Themen 9
B Prüfen, ob Country Code in Europa ist? Java Basics - Anfänger-Themen 24
L Prüfen ob Fax (Tif-Datei) vollständig angekommen ist Java Basics - Anfänger-Themen 15
O Datenstruktur auf SET prüfen in O(n) Java Basics - Anfänger-Themen 32
O Einzelne Bits umwandeln und prüfen Java Basics - Anfänger-Themen 23
U Mehrfacheingabe auf bestimmte Parameter prüfen Java Basics - Anfänger-Themen 8
B Prüfen, ob Datum2 der gleiche Tag ist wie Datum1 Java Basics - Anfänger-Themen 10
Dimax Erste Schritte String Eingabe Prüfen Java Basics - Anfänger-Themen 11
S char auf buchstabe/zeichen prüfen Java Basics - Anfänger-Themen 1
S Array doppelter Wert prüfen Java Basics - Anfänger-Themen 7
B Prüfen, ob es schon einen Termin gibt in einem Zeitraum Java Basics - Anfänger-Themen 5
K Linux Speicherplatz mit Java prüfen Java Basics - Anfänger-Themen 4
O Array nach gleichen Zahlen prüfen und ausgeben Java Basics - Anfänger-Themen 6
G Compiler-Fehler Auf Anagramm prüfen Java Basics - Anfänger-Themen 1
B Excel File einlesen und Überschrift prüfen Java Basics - Anfänger-Themen 8
DaCrazyJavaExpert Input/Output Prüfen wie oft etwas eingegeben wurde Java Basics - Anfänger-Themen 2
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
S Prüfen ob Zelle in Excel leer ist funktioniert nicht (Apache POI) Java Basics - Anfänger-Themen 18
C Klassen Reguläre Ausdrücke auf Gleichheit prüfen Java Basics - Anfänger-Themen 5
M Erste Schritte Java prüfen ob eine der Möglichkeiten erfüllt ist Java Basics - Anfänger-Themen 2
R Auf Nachkommastellen prüfen. Java Basics - Anfänger-Themen 2
P Argumente auf plausibilität prüfen... Java Basics - Anfänger-Themen 8
F LimitedQueue auf Datum prüfen Java Basics - Anfänger-Themen 6
B Passwort prüfen bis eindeutig - while Schleife? Java Basics - Anfänger-Themen 11
Tommy Nightmare Variable auf mehrere Ungleichheiten prüfen Java Basics - Anfänger-Themen 18
B String mit Emailadresse prüfen Java Basics - Anfänger-Themen 11
E 2D Arrays auf Ungleichheit prüfen! Java Basics - Anfänger-Themen 5
MrSnake Prüfen ob TitledPane schon besteht Java Basics - Anfänger-Themen 2
B Serial Key prüfen -> String mit privatem Key und dann abgleichen; Summe = 0 Java Basics - Anfänger-Themen 8
N Compiler-Fehler Iban prüfen Java Basics - Anfänger-Themen 7
J Prüfen ob Arrays nur mit einem Wert belegt sind Java Basics - Anfänger-Themen 3
M String prüfen Java Basics - Anfänger-Themen 7
E Prüfen ob Sammlung gesetzt wurde - Lebensmittelsammlung Java Basics - Anfänger-Themen 8
H Zufällig generierte Zahlen auf Eingabe prüfen Java Basics - Anfänger-Themen 5
S Prüfen ob bestimmter Ordner geöffnet ist (Windows XP) Java Basics - Anfänger-Themen 5
Ruvok Prüfen ob bestimmtest Element existiert im Array Java Basics - Anfänger-Themen 11
DeVolt Java8 Paket Time: Datum prüfen / try-catch Java Basics - Anfänger-Themen 1
W char-Array auf bestimmte Zeichen prüfen Java Basics - Anfänger-Themen 10
S String auf Pallindromeigenschaft prüfen Java Basics - Anfänger-Themen 15
AssELAss Datums-Objekt prüfen ob im gleichen Monat? Java Basics - Anfänger-Themen 5
Screen Input/Output Wie prüfen ob Stream1 in Stream2 enthalten ist (on-the-fly) ? Java Basics - Anfänger-Themen 5
P Seite auf Inhalt prüfen Java Basics - Anfänger-Themen 2
I Prüfen ob Webseite existiert Java Basics - Anfänger-Themen 3
Z Inputs prüfen Java Basics - Anfänger-Themen 6
G Textdatei auf Dubletten prüfen Java Basics - Anfänger-Themen 8
I Prüfen von zwei Listen Java Basics - Anfänger-Themen 1
K zwei Rechtecke auf Berührung prüfen Java Basics - Anfänger-Themen 2
G String auf Format prüfen Java Basics - Anfänger-Themen 3
J Eingabewert übergeben und prüfen von showInputDialog Java Basics - Anfänger-Themen 4
L 6stellige Zufallszahlen erzeugen & auf einzigartigkeit prüfen Java Basics - Anfänger-Themen 3
S Array befüllen & auf doppelte werte prüfen Java Basics - Anfänger-Themen 6
M Punkt auf eine Farbe prüfen Java Basics - Anfänger-Themen 8
K Eindimensionalen Array prüfen Java Basics - Anfänger-Themen 5
M Konstruktor auf null prüfen, Arrays Java Basics - Anfänger-Themen 9
O Prüfen ob ein String den selben Namen hat wie eine Booleanreihe? Java Basics - Anfänger-Themen 17
J Arrays prüfen und über if Bedingung ausgeben Java Basics - Anfänger-Themen 15
B Interface Generics: prüfen ob Interface deklariert wird Java Basics - Anfänger-Themen 18
L Erste Schritte Einträge in ArrayList prüfen Java Basics - Anfänger-Themen 4
S OOP long prüfen Java Basics - Anfänger-Themen 5
H Prüfen, ob jpg image schon vorhanden ist, bevor es geladen wird Java Basics - Anfänger-Themen 13
L Eine ArrayList auf gleiche Inhalte prüfen Java Basics - Anfänger-Themen 10
Rayo Eingelesene Ascii Zahlen wie normale Zahlen prüfen Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben