2016-04-18 2 views
4

«Массив используется для хранения десяти целых чисел. Напишите программу Java, которая определяет и печатает квадратные числа, которые также являются нечетными числами из данного массива».квадратных чисел Java

Проблема у меня есть, как выяснить, является ли число в массиве квадратным числом. Я пробовал этот путь, но это не правильно!

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]); 
      } 
     } 
    } 
} 

Это есть выход это дает мне

run: 
25 
81 
55 
25 
55 

55 слишком это означает, что этот метод я использовал не увенчались успехом!

+0

Я думаю, вы имеете в виду, что числа должны быть квадратами целых чисел только потому, что каждое положительное число является квадратом некоторого действительного числа. Следовательно, вы можете проверить, является ли 'y' целочисленным (т. Е. Часть дробей равна 0 или, по крайней мере, очень мала из-за ошибок точности). – Thomas

+0

Проверьте это [ссылка] (http://stackoverflow.com/questions/295579/fastest-way-to-determine-if-an-integers-square-root-is-an-integer) – greenPadawan

ответ

5

Вы только могли бы сделать:

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

Почему он не должен устранять даже если это требование? – Thomas

+1

Если в вычислении sqrt есть ошибка, она может округлить .... –

+0

@PeterLawrey, например? :) –

5

Вы можете определить, является ли число квадрат, проверяя, если его квадратный корень является целым числом.

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

Если вы знаете x является int вы не должны получить сообщение об ошибке округления, и вы можете сделать

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

Этот шаблон можно использовать в пределах точности «double», хотя 'int' не будет проверять эти ограничения. –

2

надеюсь, что это будет намного проще,

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

В здесь внутри если условие сначала я проверяю, является ли число нечетным числом, принимая модульное деление, а второе условие проверяет, является ли число идеальным квадратом. Сначала я получаю квадратный корень из заданного числа, а затем беру модульное деление на 1 и проверяю, равно ли оно 0. Если число является идеальным квадратом, квадратный корень из этого числа является целым числом, когда я принимаю модульное деление целого числа ответ должен быть равен 0.

Смежные вопросы