Encuentra el número de raíces cuadradas entre dos números

He escrito esta función para encontrar el número de Raíces cuadradas entre dos números (inclusive).

static int FindRoot(int no1, int no2) {
    int res = 0;
    for (int x = no1; x <= no2; x++) {
        for (int y = 1; y <= no2; y++) {
            if (y * y == x)
                res++;
        }
    }
    return res;
}

Esto funcionará bien, pero estaba pensando en su rendimiento. Debido a que en este caso, inner For loopse ejecutará desde la posición inicial (1), por lo que tomará tiempo si alguien pasa un gran rango de números al método.

Entonces, mi pregunta es:

¿Hay alguna otra forma en que pueda encontrar esto con un mejor rendimiento?

PD: no puedo usar la Math.sqrt()función

Respuesta 1
static int FindRoot(int no1, int no2) {
    int res = 0;
    int x = 0;

    // Ignore squares less than no1
    while(x*x < no1) {
        x++;
    }

    // Count squares up to and including no2
    while(x*x <= no2) {
        res++;
        x++;
    }

    return res;
}
Respuesta: 2

Puede salirse con la suya con un solo bucle eliminando el bucle externo

static int findRoot(int lo, int hi) {
    int numRoots = 0;

    for (int x = 0, x2 = 0; x2 <= hi; x++, x2 = x * x) {
        if (x2 >= lo) {
            numRoots++;
        }
    }    

    return numRoots;
}

aquí efectivamente solo hace su ciclo interno una vez, incrementando numRootscuando x2(x-cuadrado) está entre loy hi, y terminando el ciclo cuando x2es mayor que hi(en lugar de cuando xes mayor que hicomo en su código).

Respuesta: 3

Funcionará también.

static int FindRoot2(int no1, int no2) {
    int res = 0;
    int inner=1;
    for (int x = no1; x <= no2; x++) {
        for (int y = inner; y <= no2; y++) {
            if (y * y == x)
            {
                inner=y;
                res++;
            }
        }
    }
    return res;
}

En este caso, el bucle interno no comenzará a ejecutarse desde 1.

Respuesta: 4

Estoy tratando de inicializar una matriz de tipo booleano cuyo tamaño es un entero de 10 dígitos. Sigue lanzando OutOfMemoryException. He aumentado el tamaño del espacio de almacenamiento dinámico del eclipse a 1024 desde 256. ...

Tengo una redis key / value store que contiene blobs (tamaño en decenas de MB), y el cliente jedis que estoy usando en mi aplicación java devuelve una matriz de bytes del método get de la conexión jedis. Actualmente yo ...

Quiero usar el paquete de mosaicos incluido de la solución de osmdroid para usar mapas sin conexión ya que Mobile Atlas Creator no funcionó para mí (quiero niveles de zoom de 16x que no es posible con esta herramienta). Los ...

¿Cómo puedo encontrar el nombre de la máquina virtual Java actualmente en ejecución? Quiero obtenerlo de la API de Java. Gracias