Quadratzahl-Test

Status
Nicht offen für weitere Antworten.

0001001

Bekanntes Mitglied
Hallo,

hab mir ein paar Zeilen geschrieben, die überprüfen sollen ob eine Zahl eine Quadratzahl (z.B. 9, 49, 64) ist. Allerdings ist der noch nicht wirklich effizient. Wäre super wenn sich das mal jemand anschauen könnte und vielleicht einen Verbesserungsvorschlag machen könnte.
Code:
	public boolean checkifsquarenumber2(int number){
		boolean check = false;		
		int lastnumber, secondlastnumber;
		String aaa = String.valueOf(number);
		lastnumber = Integer.parseInt(String.valueOf( aaa.charAt(aaa.length()-1)));		// get the last number
		secondlastnumber = Integer.parseInt(String.valueOf( aaa.charAt(aaa.length()-2))); // get the secondlast number
		if (secondlastnumber == 2 || secondlastnumber == 4 || secondlastnumber == 6 || secondlastnumber == 8 || secondlastnumber == 0){
			if (lastnumber == 1 || lastnumber == 4 || lastnumber == 9){
				if (Math.pow(Math.sqrt(Double.parseDouble(aaa)),2) == Double.parseDouble(aaa)){ 	// checks if: (number^(1/2))² == number				
					check = true;
				}
			}
		}
		if ((secondlastnumber == 1 || secondlastnumber == 3 || secondlastnumber == 5 || secondlastnumber == 7 || secondlastnumber == 9) && lastnumber == 6){	
			if (Math.pow(Math.sqrt(Double.parseDouble(aaa)),2) == Double.parseDouble(aaa)){						
				check = true;
			}			
		}
		return check;
	}

Hier eine kurze Beschreibung des Algorithmus:
Zuerst werden die letzten beiden Ziffern der übergebenen Zahl gespeichert. Das liegt daran, dass man anhand der letzten beiden Ziffern oft ausschliessen kann dass es eine Quadratzahl ist. Bei einer Quadratzahl gibt es es nur 22 Möglichkeiten: 00, x1, x4, 25, y6 und x9, wobei x für eine gerade und y für eine ungerade Ziffer steht. (Quelle: Wikipedia).
Falls die Zahl den obigen Anforderungen entspricht, wird mit:
Code:
if (Math.pow(Math.sqrt(Double.parseDouble(aaa)),2) == Double.parseDouble(aaa))
überprüft ob es wirklich eine Quadratzahl ist. Es wird folgendes berechnet: (number^(1/2))² == number
Leider rundet Math.sqrt, ansonsten würde man schon erkennen, ob es eine Quadratzahl ist, indem man schaut ob die Wurzel eine ganze Zahl ergibt. Da Math.sqrt und Math.pow nur Double unterstützen, hab ich das häßliche Double.parseDouble() benutzt.

Wäre super wenn jemand den Algorithmus verbessern könnte, denn ich glaube der ist noch ziemlich ineffizient
 

Wildcard

Top Contributor
Ehrlich gesagt halte ich deine Optimierungen für Kontraproduktiv. Das Wurzelziehen sollte relativ effizient erfolgen und daher schneller sein als dein derzeitiger Ansatz.
 

0001001

Bekanntes Mitglied
Leroy42 hat gesagt.:
... und wofür braucht man sowas? :shock:
hierfür z.B. http://de.wikipedia.org/wiki/Faktorisierungsmethode_von_Fermat

Wildcard hat gesagt.:
Ehrlich gesagt halte ich deine Optimierungen für Kontraproduktiv. Das Wurzelziehen sollte relativ effizient erfolgen und daher schneller sein als dein derzeitiger Ansatz.
Wieso? das ist doch nur ein simpler Vergleich der bestimmt schneller geht, als die Wurzel zu ziehen?! Dadurch werden sehr viele Zahlen von vornherein ausgeschlossen.
 
S

SlaterB

Gast
also bei mir ist
Math.sqrt(17) = 4.123105625617661
da läßt sich doch gut erkennen, dass das keine ganze Zahl ist,

bei dir kommt da 4.00000000 raus oder wie?

da bei mir sqrt nicht rundet funktioniert dein Algoritmus bei mir nicht
----------

die Fälle 'letzte Ziffern 00 und 25' hattest du vergessen

---------

wieso machts du einen String aus der Zahl, der danach auch noch zweimal(!) wieder nach Double gecastet wird?
ineffizienter gehts ja kaum noch,
zumal die Zahl doch immernoch als int verfügbar ist (number)

bei mir wurde es ~8x schneller, nachdem ich das entfernt hatte..
--------

wenn du im ersten if-Block auf gerade vorletzte Zahl prüfst,
wozu dann im zweiten if-Block nochmal auf ungerade prüfen?,
benutze einfach ein else, dann sparst du ein bisschen
(naja, hauptsächlich Code-Zeilen..)

------

die Berechnung der letzten Stellen in int ist aber tatsächlich langsamer als nur sqrt,
selbst wenn man nur eine Berechnung der letzten beiden Ziffern macht
und auf ein 100er-Array zurückgreift, reicht es nicht
(getestet mit Berechnung von 10 Mio Zahlen oder so)

berücksicht man noch mehr Stellen wirds irgendwann sicher besser, aber das Array immer größer,

denn vergleich man nur die Berechnung der letzten x Stellen mit modulo
mit der Wurzelberechnung, so ist das Stellen-Berechnen knapp schneller ;)

mit Bit-Operationen und anderen Optimierungen machts vielleicht doch irgendwann Sinn,
allerdings kann auch beim sqrt noch viel eingespart werden,
2/3 der Zeit gehen dort (bei mir) für den Test drauf, ob die Wurzel nun eine ganze Zahl ist oder nicht ;)

Code:
public class Test {

	static boolean[] secondlastsArray = new boolean[100];

	public static void main(String args[]) throws Exception {
		for (int i = 0; i < 100; i++) {
			int lastnumber = i % 10;
			int secondlastnumber = (i / 10) % 10;

			boolean b = false;
			if (secondlastnumber == 2
				|| secondlastnumber == 4
				|| secondlastnumber == 6
				|| secondlastnumber == 8
				|| secondlastnumber == 0) {
				if ((lastnumber != 1)
					&& (lastnumber != 4)
					&& (lastnumber != 9)) {
					b = true;
				}
			} else if (lastnumber != 6) {
				b = true;
			}

			if ((secondlastnumber == 2) && (lastnumber == 5)) {
				b = false;
			} else if ((secondlastnumber == 0) && (lastnumber == 0)) {
				b = false;
			}

			secondlastsArray[i] = b;
			//	p("i: " + i + " " + secondlastsArray[i]);
		}

		long time = System.currentTimeMillis();

		for (int i = 10; i < 10000000; i++) {
			//		for (int i = 10; i < 1000; i++) {
			//		for (int i = 121; i < 122; i++) {
			//		if (checkifsquarenumber2(i)) {
			//			p("i: " + i);
			//		}
			checkifsquarenumber2(i);

		}

		p("time: " + (System.currentTimeMillis() - time));
	}

	public static boolean checkifsquarenumber2(int number) {

		//int secondlasts = number % 100;
		//if (secondlastsArray[secondlasts]) {
		//	return false;
		//}

		double sqrt = Math.sqrt(number);
		return (sqrt - ((int) sqrt) < 0.000000000001);
	}

	public static void p(double i) {
		p("" + i);
	}

	public static void p(Object o) {
		System.out.println(((o == null) ? "null" : o));
	}
}
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
C Datentypen Prüfen of eine Zahl Quadratzahl ist Java Basics - Anfänger-Themen 2
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
W junit.Test not accessible? Java Basics - Anfänger-Themen 4
W Junit-Test (Java) Java Basics - Anfänger-Themen 4
W Testfälle bei Java ( Junit-Test) Java Basics - Anfänger-Themen 3
D Hilfe bei Calculator Test Java Basics - Anfänger-Themen 15
U jUnit 5 Test für eine addMethode Java Basics - Anfänger-Themen 18
M Test auf Exceptions schreiben Java Basics - Anfänger-Themen 11
P Eclipse Karate Framework API Test . Unexpected Error: the trustAnchors parameter must be non-empty Java Basics - Anfänger-Themen 1
I Variable innerhalb Methode: Local variable test defined in an enclosing scope must be final or effectively final Java Basics - Anfänger-Themen 3
A Junit Test für MysqlDataSource JDBC Java Basics - Anfänger-Themen 3
A Test Junit Java Basics - Anfänger-Themen 1
H Junit test Java Basics - Anfänger-Themen 12
P JUnitTest Best Practise (Ein Assert pro Test?) Java Basics - Anfänger-Themen 10
P Methoden JUnit 4 - Test Java Basics - Anfänger-Themen 6
Mr_Kleeblatt Operatoren if (arri[i] != "test.java"&& arri[i] != "test.class") Java Basics - Anfänger-Themen 3
N Fehler bei JUnit Test Java Basics - Anfänger-Themen 5
L Test-Methoden schreiben Java Basics - Anfänger-Themen 13
D Test auf Dopplungen Java Basics - Anfänger-Themen 32
neerual Klassen Wie rufe ich Klassen, die andere Klassen extenden in einer Test Unit auf? Java Basics - Anfänger-Themen 10
B JUnit Test erstellen Java Basics - Anfänger-Themen 6
B zzz.test Java Basics - Anfänger-Themen 13
W Problem bei JUnit Test Aufgabe Java Basics - Anfänger-Themen 15
W JUnit Test und HashCode Java Basics - Anfänger-Themen 14
C Erste Schritte Hexidezimal-Test Java Basics - Anfänger-Themen 2
A Kfz - Händler Klasse. JUnit-Test gibt noch Fehler an, aber finde Ursache nicht Java Basics - Anfänger-Themen 7
B Palindrom Test mit Junit Java Basics - Anfänger-Themen 23
T Minesweeper Test Java Basics - Anfänger-Themen 2
S Junit Test Java Basics - Anfänger-Themen 2
F Test Java Basics - Anfänger-Themen 12
W Ist das ein legitimer Test? Java Basics - Anfänger-Themen 5
shiroX Methoden JUnit-Test einer void-Methode Java Basics - Anfänger-Themen 4
U Best Practice Datenbereitstellung Unit Test Java Basics - Anfänger-Themen 6
B Binäre Suche - Junit Test Java Basics - Anfänger-Themen 6
B Datentypen Test float und double speichern Zahlen nur ungefähr Java Basics - Anfänger-Themen 4
Z Vererbung Test auf Normalverteilung, Wilcoxon Java Basics - Anfänger-Themen 3
M Assertion NotNull Test Java Basics - Anfänger-Themen 3
S Separate Funktion für JUnit-Test Java Basics - Anfänger-Themen 3
W Test, ob Datei existiert, schlägt fehl Java Basics - Anfänger-Themen 4
T JUnit test failed Java Basics - Anfänger-Themen 3
H Array Test Methode schreiben Java Basics - Anfänger-Themen 3
R JUnit Test mit einer Dateistruktur als Testparameter Java Basics - Anfänger-Themen 3
V Bruchrechner Test Java Basics - Anfänger-Themen 7
T Test läuft schief Java Basics - Anfänger-Themen 3
shiroX OOP Array kleinste Zahl mit jUnit test Java Basics - Anfänger-Themen 3
G mache aus Test nach sortieren estt oder java aajv Java Basics - Anfänger-Themen 5
S Code stimmt nicht für vorgegebenen JUnit-Test Java Basics - Anfänger-Themen 2
x22 Java Multiple Choice Test Java Basics - Anfänger-Themen 8
R JUnit Test mit mehrfach ausgeführt Java Basics - Anfänger-Themen 6
B JUnit - Mini-Test Java Basics - Anfänger-Themen 9
T Unterschied zwischen Integrationstest und JUnit test? Java Basics - Anfänger-Themen 12
N Test mit assert Java Basics - Anfänger-Themen 9
Y Junit Test - Testwert ändert sich Java Basics - Anfänger-Themen 12
K Palindrom Test Java Basics - Anfänger-Themen 9
S Performance-/Stress Test für Webanwendung Java Basics - Anfänger-Themen 2
V Mediaplayer - NullPointerException bei Unit-Test Java Basics - Anfänger-Themen 4
H Ich kann mein Java Programm Test.class nicht ausführen Java Basics - Anfänger-Themen 6
H Javabefehl Test Java Basics - Anfänger-Themen 3
S Hilfe zu Java-Programm und JUnit Test!! Java Basics - Anfänger-Themen 5
T JUNit Test IOException Java Basics - Anfänger-Themen 5
H lucas-test Java Basics - Anfänger-Themen 14
P White-Box-Test Verständnisproblem Java Basics - Anfänger-Themen 11
N Methoden Test ob Server vorhanden ist Java Basics - Anfänger-Themen 4
N Test Datei = Bild Java Basics - Anfänger-Themen 5
S Erste Schritte 1. Test Programm Java Basics - Anfänger-Themen 21
Spin JUNIT Test Case - Problem bei testen Java Basics - Anfänger-Themen 2
T brauche HILFE beim Junit test:eek: Java Basics - Anfänger-Themen 11
timbeau JUnit Test Dauer speichern/loggen Java Basics - Anfänger-Themen 16
E Am Mittwoch Test und ich checks überhaupt nich Java Basics - Anfänger-Themen 27
A junit test wann verwendet man "was"? Java Basics - Anfänger-Themen 4
J JUnit Test Java Basics - Anfänger-Themen 2
D Test einer Chipkarte Java Basics - Anfänger-Themen 2
J Problem mit Test-Klasse Java Basics - Anfänger-Themen 4
E Test, ob String in Double umwandelbar ist Java Basics - Anfänger-Themen 3
J Test steht vor der Tür !! Java Basics - Anfänger-Themen 2
X Array nur mit Zahlen (test) Java Basics - Anfänger-Themen 11
Houly JUnit Test Suite anlegen Java Basics - Anfänger-Themen 6
F Primitiver Lucas-Lehmer-Test hängt sich auf Java Basics - Anfänger-Themen 7
M Erster HashMap-test Java Basics - Anfänger-Themen 5
O Test auf JComponent Java Basics - Anfänger-Themen 7
pun Junit Test erkennt Exception nicht.. Java Basics - Anfänger-Themen 14
D C0 und C1 Test nochmal Java Basics - Anfänger-Themen 9
D C0 und C1 Test Java Basics - Anfänger-Themen 3
G BlueJ jUnit Test Java Basics - Anfänger-Themen 6
J Test auf UTF-8 Java Basics - Anfänger-Themen 2
M Wo und wie speich. ich .java und wo den zugehörigen test? Java Basics - Anfänger-Themen 2
Shalimar Test, ob mehr pos. oder neg. Zahlen Java Basics - Anfänger-Themen 3
M test Java Basics - Anfänger-Themen 5
M test Java Basics - Anfänger-Themen 2
M test Java Basics - Anfänger-Themen 10
V Test mit JUnit verbinden Java Basics - Anfänger-Themen 3
M test Java Basics - Anfänger-Themen 4
H Miller Rabin Test Primzahlen werden teilweise nicht gefunden Java Basics - Anfänger-Themen 5
C Multiple Choice Test Java Java Basics - Anfänger-Themen 5
G Grundfläche färben, ein Bild (NORTH) ind Test darunter? Java Basics - Anfänger-Themen 6
M Palindrom Test mit Char-arrays! Java Basics - Anfänger-Themen 3
M Java Test Übungsfragen Hilfe! Java Basics - Anfänger-Themen 5
B JUnit Test Klasse Rational Java Basics - Anfänger-Themen 12
N class Test<E extends MyAbstractClass> => typ von E? Java Basics - Anfänger-Themen 5
G jar cvf test.war -C src/ WEB-INF -C src/ ALLE JSP Wildcard? Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben