G
Gast
Gast
Hallo!
Ich bin auf der Suche nach einer Methode, um alle quadratfreien Zahlen auszugeben. Habe mir Folgendes überlegt:
Quadratfrei heißt, dass wenn man die Zahl in Faktoren auseinandernimmt (z.B. i) 6 = 2*3; ii) 54 = 2 * 3 * 3 * 3), dass dort keine (Prim)zahl doppelt auftauchen darf. So wäre i) eine quadratfreie Zahl, ii) aber nicht. Soweit richtig, oder?
Somit müsste man doch einfach nur 54 solange durch 2 teilen, bis eine ganze Zahl herauskommt, falls nicht, soll man dann die davorgegangene Zahl nehmen und dann durch 3 teilen, etc. Konkretes Beispiel hieße dann:
20 % 1 == 0 (gerade Zahl)
20 / 2 = 10
10 % 1 == 0 (gerade Zahl)
10 / 2 = 5
5 % 1 == 0 (gerade Zahl)
5 / 2 != 0 (ungerade)
5 % 1 == 0
5 / 3 != 0
....
5 / 5 == 1
Somit wäre 20 = 2 * 2 * 5 * 1 und gleichzeitig eine Quadratzahl, da die 2 zwei Mal vorkommt. Soweit richtig überlegt?
Programmiertechnisch wäre das dann mit einer Schleife zu lösen:
Ist doch soweit richtig überlegt? Oder kann man sogar noch effizienter lösen?
Grüße, Gast
Ich bin auf der Suche nach einer Methode, um alle quadratfreien Zahlen auszugeben. Habe mir Folgendes überlegt:
Quadratfrei heißt, dass wenn man die Zahl in Faktoren auseinandernimmt (z.B. i) 6 = 2*3; ii) 54 = 2 * 3 * 3 * 3), dass dort keine (Prim)zahl doppelt auftauchen darf. So wäre i) eine quadratfreie Zahl, ii) aber nicht. Soweit richtig, oder?
Somit müsste man doch einfach nur 54 solange durch 2 teilen, bis eine ganze Zahl herauskommt, falls nicht, soll man dann die davorgegangene Zahl nehmen und dann durch 3 teilen, etc. Konkretes Beispiel hieße dann:
20 % 1 == 0 (gerade Zahl)
20 / 2 = 10
10 % 1 == 0 (gerade Zahl)
10 / 2 = 5
5 % 1 == 0 (gerade Zahl)
5 / 2 != 0 (ungerade)
5 % 1 == 0
5 / 3 != 0
....
5 / 5 == 1
Somit wäre 20 = 2 * 2 * 5 * 1 und gleichzeitig eine Quadratzahl, da die 2 zwei Mal vorkommt. Soweit richtig überlegt?
Programmiertechnisch wäre das dann mit einer Schleife zu lösen:
Java:
int x = 20;
for (int a = 2; a <= Math.sqrt(x) + 1;) // Damit er nicht größere Zahlen nimmt; 2*5 = 5*2, 5*2 unnötig zu berechnen
{
if(x % 1 == 0)
{
x = x / a;
}
if(x % 1 != 0)
{
x = x * a; // die Zahl zurückwandeln
a++; // anscheinend klappte es nicht mit dem a=2 (als Beispiel); dann versuchen wir mit a=3, etc.
}
}
Ist doch soweit richtig überlegt? Oder kann man sogar noch effizienter lösen?
Grüße, Gast