style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Performace en codigo

Hola a todos.
Pues miren mi duda es la siguiente como mejorar el perfomace del siguiente codigo ya que tarda mucho tiempo de ejecucion en mostrar el resultado por la cantidad de numeros:

import java.util.Scanner;

public class Problema1 {

        public static void main(String []agrs){
                Scanner leer=new Scanner(System.in);
               
                System.out.print("Introduce el numero:");
                int numero=leer.nextInt();
                int n=0;
                for(int i=0;i<=1000000;i++){
                        for(int j=0;j<=1000000;j++){
                               
                                if((int)Math.pow(i, 2)-(int)Math.pow(j, 2)==numero){
                                        System.out.println((int)Math.pow(i, 2)+"----"+(int)Math.pow(j, 2));
                                        n++;
                                }
                        }
                }
                System.out.print("Numero veces:"+n);
        }
}

Saludo.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de ezamudio

varias

son tantas iteraciones, que con un poquito que optimices algo vas a notar una buena diferencia. Especialmente en el ciclo interno.

Estás haciendo un billón de iteraciones (y un billón de los buenos, no de los gringos). Lo tardado es estar elevando ambos números al cuadrado y comparando con el número.

Para empezar, es más rápido si haces i*i y j*j que invocar Math.pow. Luego, es más rápido si haces la operación una sola vez, y no dos (una vez para ver si se cumple, y cuando se cumple, se hace otra vez para imprimir, cuando pudiste haber guardado el valor para solamente imprimirlo).

Luego, deberías analizar el número contra el que estás comparando y ajustar los parámetros del ciclo de manera apropiada. Para empezar, sólo te sirve empezar de 0 cada ciclo si el número que te dieron es 0 (y ese debería incluso ser tratado como un caso especial). Cero al cuadrado siempre va a ser cero, de modo que estás ejecutando un millón de comparaciones innecesarias. Si empiezas en 1, sabes que 1*1==1 de modo que ahí te podrías saltar la multiplicación (aunque tal vez no valga tanto la pena, pero bueno, son un millón de multiplicaciones que te ahorras).

Si el número es positivo, j siempre debe ser mayor que i, no tiene caso que compares lo contrario porque te va a dar un número negativo. Si j es negativo, j siempre debe ser menor que i, no tiene caso que compares lo contrario porque te va a dar un número positivo. En otras palabras, si el número es positivo, el ciclo interno debe ir de 1 a i pero si es negativo, el ciclo interno debe ir de i a 1000000.

Con eso debes reducir drásticamente el número de operaciones ejecutadas y por tanto mejorar notablemente el tiempo de ejecución.

Optimizacion

El programa pregunta si a^2-b^2=n por fuerza bruta ,podemos reescribirlo como a^2-n=b^2 y de esta forma eliminamos el ciclo de b y solo preguntamos si b es un numero cuadrado y tambien tu codigo tiene error de desbordamiento entero.

import java.util.Scanner;

public class Problema1 {

    public static void main(String []agrs){
        Scanner leer=new Scanner(System.in);

        System.out.print("Introduce el numero:");
        int numero=leer.nextInt();
        int n=0;
        for(int i=0;i<=1000000;i++){
            long a2= i;
            a2*=a2;
             double b= Math.sqrt(a2-numero);
            if(Math.ceil(b)==Math.floor(b)){
                    long b2=(int)b;
                    b2*=b2;
                    System.out.println(a2+"----"+b2);
                    n++;
                }
            }
        System.out.print("Numero veces:"+n);
    }
}

Aunque tambien podria haber otras optimizaciones.

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">