2016-04-18 13 views
4

"Ein Array wird verwendet, um zehn Integer-Zahlen zu speichern. Schreiben Sie ein Java-Programm, das die quadratischen Zahlen ermittelt und ausgibt, die auch ungerade Zahlen aus dem angegebenen Array sind."quadratische Zahlen Java

Das Problem, das ich habe, ist herauszufinden, ob die Zahl im Array eine quadratische Zahl ist. Ich habe es versucht, aber es ist nicht korrekt!

import java.math.*; 
public class JavaApplication43 { 

    public static void main(String[] args) { 

     int[] no = {22, 44, 25, 89, 81, 55, 23, 25, 55}; 

     for (int i = 0; i < no.length; i++) { 

      int x = no[i]; 
      double y; 
      if (x % 2 != 0) { 
       y = Math.sqrt(x); 
       if (x == (Math.pow(y, 2))) 
        System.out.println(no[i]); 
      } 
     } 
    } 
} 

Dies ist die Ausgabe, die es mir

run: 
25 
81 
55 
25 
55 

55 wird auch das bedeutet, diese Methode, die ich verwendet, gibt nicht erfolgreich ist!

+0

Ich denke, Sie meinen, die Zahlen müssen Quadrate von ganzen Zahlen nur sein, da jede positive Zahl ein Quadrat einer reellen Zahl ist. Daher könnten Sie überprüfen, ob y eine Ganzzahl ist (d. H. Der Bruchteil ist 0 oder zumindest sehr klein wegen Genauigkeitsproblemen). – Thomas

+0

Überprüfen Sie diese [link] (http://stackoverflow.com/questions/295579/fastest-way-to-determine-if-an-integers-square-root--ist-integer) – greenPadawan

Antwort

5

Sie könnten nur tun:

for (int i = 0; i < no.length; i++) { 
    int x = no[i]; 
    if (x % 2 == 0) continue; 
    int y = (int) Math.sqrt(x); 
    if (x == y * y) { 
     System.out.println(x); 
    } 
} 
+0

Warum sollte er nicht beseitigen gerade Zahlen, wenn das eine Voraussetzung ist? – Thomas

+1

Wenn es einen Fehler in der sqrt Berechnung gibt, könnte es abgerundet werden .... –

+0

@PeterLawrey, zum Beispiel? :) –

5

Sie können bestimmen, ob eine Zahl ein Quadrat, indem geprüft wird, ob seine Quadratwurzel eine ganze Zahl ist.

double sqrt = Math.sqrt(x); 
long sqrt2 = Math.round(sqrt); 
if (Math.abs(sqrt - sqrt2)/sqrt < 1e-15) 
    // we have a square. 

Wenn Sie x wissen, ist ein int Sie sollten kein Rundungsfehler und Sie können

int x = ... 
double sqrt = Math.sqrt(x); 
if ((int) sqrt == sqrt) 
    // we have a square. 
+0

Dieses Muster kann bis zu den Grenzwerten der "doppelten" Genauigkeit verwendet werden, obwohl "int" diese Grenzen nicht testet. –

2

Hoffnung tun dies viel einfacher sein wird,

if((arr[i]%2 != 0) & (Math.sqrt(arr[i])%1 == 0)){ 
     System.out.println(arr[i]); 
    } 

Hier drinnen im Inneren Wenn die Bedingung zuerst ist, prüfe ich, ob die Zahl eine ungerade Zahl ist, indem ich die Division des Moduls und die zweite Bedingung überprüfe, ob die Zahl ein perfektes Quadrat ist. Zuerst erhalte ich die Quadratwurzel der gegebenen Zahl und nehme dann die Modul-Division durch 1 und überprüfe, ob sie gleich 0 ist. Wenn Zahl ein perfektes Quadrat ist, ist die Quadratwurzel dieser Zahl eine ganze Zahl, wenn ich die Modul-Division einer ganzen Zahl nehme Antwort sollte gleich 0 sein.