Avaliem por favor :D

Comecei a estudar java essa semana, e foi proposto para mim um exercicio assim:

Baseado na Equação de Pell este é um método para obter a raiz quadrada simplesmente subtraindo números ímpares.

Ex: para obter a raiz de 27 nós começaos com a seguinte sequência:

  1. 27 - 1 = 26
  2. 26 - 3 = 23
  3. 23 - 5 = 18
  4. 18 - 7 = 11
  5. 11 - 9 = 2

5 passos foram tomados e isso nos leva que a parte inteira da raiz quadrada de 27 é 5.

Então eu consegui fazer, porém eu sei q foi um codigo mto grande para algo simples assim, então queria que vcs avaliassem e digam se estou indo bem, pq demorei um bocado pra conseguir fazer =P
espero não causar raiva em ninguem ao ler isso, mais é meu primeiro topico no forum e queria saber a opinião de alguem com mais experiencia :D, vlw galera.

Esse foi meu codigo:


import java.util.ArrayList;
import java.util.Scanner;

public class Pell {
	
	
	public static void main(String[] args) {
		
		Scanner scan = new Scanner(System.in);
		int s;
		System.out.println("Digite um numero: ");
		s = scan.nextInt();
		
		int impar = 1;
		int raiz = s;
		int result = s - impar;
		int resultAnterior;
		
		System.out.println("....::::Resolvendo Raiz Quadrada pelo metodo de pell::::....");
		
		
		System.out.println("Raiz Quadrada de "+s+ ":");
		
						
		result = s - impar;
		resultAnterior = result+impar;
			
		System.out.println(s+" - "+impar+" = "+result);
		ArrayList<Integer> a = new ArrayList<Integer>();
			
		while(impar<result){
			impar += 2;
			result -= impar;
			resultAnterior = result+impar;
			System.out.println(resultAnterior+" - "+impar+" = "+result);
				
				if(true){
				a.add(result);
				}
								
		}
		
		int resultFinal =a.size()+1;
		while(result == 0){
			System.out.println("A raiz é exata, o resultado é: "+resultFinal+"!!!");
			break;
			}
		
		while(result !=0){
			System.out.println("A raiz não é exata, o resultado aproximado é: "+resultFinal+"!!!");
			break;
			}
	}
}

É um algoritmo muito simples, não precisava ter usado uma lista para contar, bastava um contador mesmo (levando em conta que você não precisa fazer nada com os resultados das subtrações). Exemplo:

public static int raiz(int numero) { // auxiliar para decremento int aux = numero; // valor da raiz int raiz = 0; // como pulamos em numeros impares, pulamos de dois em dois a partir de um numero // impar de modo a sempre termos um numero impar // (impar + par = impar) for (int i = 1; aux - i &gt;= 0; i += 2) { aux -= i; raiz++; } return raiz; }

O método acima faz apenas o cálculo, pode adaptá-lo ao seu programa. Poderia usar o próprio parâmetro para a subtração, mas não é uma boa prática fazer isso.

Ah! E seja bem vindo ao GUJ :slight_smile:

Bem facil mesmo, e eu quebrando a cabeça ‘-’, tentei usar o “for” da maneira q vc fez ai, não sei pq deu erro e eu pensei q não era possivel incrementar 2 no metodo “for”, o contador eu não tinha pensado kkkkk, mto obrigado pela dica :slight_smile:

deixei de uma maneira mais didatica pra você entender:

[code]public class Pell {

public static void main(String[] args) {

    Scanner scan = new Scanner(System.in);

    int impar, raiz = 0;

    System.out.println("Digite um numero: ");
    int numero = scan.nextInt();
    
    //aqui é a parte principal:
    for (impar = 1; impar <= numero; impar += 2) {
        numero -= impar;
        raiz++;
        System.out.println("Numero: " + numero + "impar: " + impar);
    }
    //---------------------------

    if (numero == 0) {
        System.out.println("Raiz Exata: " + raiz);
    } else {
        System.out.println("Raiz Aproximada: " + raiz);
    }
}

}[/code]