Dúvida com valor de array

10 respostas
britotr

Boa noite pessoal,

eu quero exibir os valores que sejam primos entre dois numeros digitados, porem estou fazendo isso atraves de metodos (que estou aprendendo na facu). Faco uma verificacao e caso seja primo, guarde em um array e vai fazedno ate ter tido todos os primos… entao eu nao sei como vou fazer por exemplo se digitar 10 e 20 tem que me mostrar 11, 13, 17, 19. Seria um array com 4 posicoes… agora se eu digitar 1 e 10000 ou 487 e 5784. Será totalmente aleatorio o valor do array, porem nao sei como fazer isso…

se nao tiver sido claro, me avisem… bom segue o que eu fiz… contudo não rolou

package javaapplication15;

import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) {
        for (int saida : isPrimo()){
            System.out.println (saida);
        }
    }

    private static int recebeValor() {
        return Integer.parseInt(JOptionPane.showInputDialog("Insira um valor numérico"));
    }

    private static int[] isPrimo() {
        int primeiroValor = 0;
        int segundoValor = 0;
        int cont = 0;
        int resto = 0;
        int valorSaida[] = new int[cont];

        primeiroValor = recebeValor();
        segundoValor = recebeValor();
        while (primeiroValor <= segundoValor) {
            for (int i = 2; i < primeiroValor; i++) {
                resto = primeiroValor % i;
                if (resto == 0) {
                    break;
                }

            }
            if (resto != 0) {
                valorSaida[cont] = primeiroValor;
                cont++;
            }
            primeiroValor++;
        }
        return valorSaida;
    }
}

a duvida é no array valorSaida[cont]… deixei cont como 0 e caso seja primo incremente… porem nao vai… como faco?

10 Respostas

Roger75

Crie um array suficientemente grande para caber todos os números. Mas acho que nem precisa de array para guardar esses números, é só ir verificando, na faixa entre o menor e o maior, se cada número é primo.

renamed

Olá.

Por que você precisa de um array para escrever os primos entre dois números? você não pode, simplesmente, ir verificando e, assim que encontrar um primo, escrevê-lo na tela?

Caso você ainda precise manter todos os números primos, reconsidere sua implementação utilizando um objeto da interface List.

ok?

britotr

renamed:
Olá.
você não pode, simplesmente, ir verificando e, assim que encontrar um primo, escrevê-lo na tela?

hahahaha… foi uma boa pergunta… não havia pensado nisso…

ficaria assim

package javaapplication15;

import javax.swing.JOptionPane;

public class Main {

    public static void main(String[] args) {
        isPrimo();
        /*for (int saida : isPrimo()) {
        System.out.println(saida);
        }*/
    }

    private static int recebeValor() {
        return Integer.parseInt(JOptionPane.showInputDialog("Insira um valor numérico"));
    }

    private static int isPrimo() {
        int primeiroValor = 0;
        int segundoValor = 0;
        //int cont = 0;
        int resto = 0;
        //int valorSaida[] = new int[cont];

        primeiroValor = recebeValor();
        segundoValor = recebeValor();
        while (primeiroValor <= segundoValor) {
            for (int i = 2; i < primeiroValor; i++) {
                resto = primeiroValor % i;
                if (resto == 0) {
                    break;
                }

            }
            if (resto != 0) {
                //  valorSaida[cont] = primeiroValor;
                //   cont++;
                System.out.println(primeiroValor);
            }
            primeiroValor++;
        }
        return 0;
    }
}

o problema é que irei precisar dos numeros para algumas outras coisas que tenho em mente ainda… por isso queria colocá-los em um array, entretanto dessa forma como você mencionou de utilizar um objeto de interface list eu não sei como usar… poderia alterar o meu codigo exemplificando para eu ver?

valeu

pedroroxd
Você vai adicionando eles num ArrayList. Fiz o seu exemplo com o ArrayList com console:
//seu package
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class PrimosEntre {

	public static void main(String[] args) {
		int primeiroValor=0,segundoValor=0,resto=0;
		List<Integer> lista = new ArrayList<Integer>();
	
		/*
		 * obriga o usuário a digitar valores válidos(o primeiro valor tem que
		 * ser menor que o segundo valor, ou seja, não pode ser maior ou igual
		 */
		while (primeiroValor >= segundoValor) {
			primeiroValor = recebeValor();
			segundoValor = recebeValor();

			if (primeiroValor >= segundoValor)
				System.out.println("O primeiro valor deve ser menor que o segundo\n");
		}

		// faz a varredura dos números entre eles
		while (primeiroValor <= segundoValor) {
			//verifica se não é primo
			for (int i = 2; i < primeiroValor; i++) {
				resto = primeiroValor % i;
				if (resto == 0) {
					break;
				}
			}
			//se for primo adiciona na lista
			if (resto != 0) {
				lista.add(primeiroValor);
			}
			primeiroValor++;
		}
                //imprime a lista
		System.out.println("\nOs primos são:\n" + lista);
	}

	private static int recebeValor() {
		System.out.println("Insira um valor numérico");
		return new Scanner(System.in).nextInt();
	}
}
britotr

entendi o que vc fez… estou apenas com um problema… estou fazendo isso dentro de um metodo…

private static int[] isPrimo() {
        List<Integer> lista = new ArrayList<Integer>();
        int primeiroValor = 0;
        int segundoValor = 0;
        int resto = 0;

        primeiroValor = recebeValor();
        segundoValor = recebeValor();
        while (primeiroValor <= segundoValor) {
            for (int i = 2; i < primeiroValor; i++) {
                resto = primeiroValor % i;
                if (resto == 0) {
                    break;
                }
            }

            if (resto != 0) {
                lista.add(primeiroValor);
            }

            primeiroValor++;
        }
        return lista;
    }

porem dá erro de imcompatibilidade no retorno… como faço pra arrumar?

renamed

Veja esse exemplo sem List:

package primos;


import java.util.Scanner;



public class Princ {

	
	/**
	 * Aqui leremos dois limites, um inferior e outro superior e vamos calcular os números primos entre
	 * esse intervalo. Quando o limite for maior que o fim, saimos do loop 
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("Digite limite inferior: ");
		int comeco = Integer.parseInt(sc.nextLine());
		System.out.print("Digite limite superior: ");
		int fim = Integer.parseInt(sc.nextLine());
		
		while (comeco < fim){
			listaPrimos(comeco, fim);
			
			System.out.print("Digite limite inferior: ");
			comeco = Integer.parseInt(sc.nextLine());
			System.out.print("Digite limite superior: ");
			fim = Integer.parseInt(sc.nextLine());
		}

	}
	
	/**
	 * Lista todos os primos que estão no intervalo
	 */
	public static void listaPrimos(int comeco, int fim){
		for(int i = comeco; i < fim; i++){
			if (ehPrimo(i)){
				System.out.println(i);
			}
		}
	}
	
	/**
	 * Verifica se um número é primo. Para verificar se um número é primo, basta procurar
	 * até sua raiz quadrada, se até lá ele não for divisível por qualquer outro número além do 1,
	 * ele não será por nenhum outro
	 */
	public static boolean ehPrimo(int numero){
	
	
		int raiz = (int) Math.sqrt(numero);
		for(int i = 2; i <= raiz; i++){
			if ((numero % i) == 0){				
				return false;
			}
		}
	
		return true;
	}

}

Desculpe o código assim, mas o sono ta batendo!

pedroroxd

olha o tipo do retorno do método que você declarou e o que você está tentando retornar…
ArrayList não é um vetor de int…

mude de private static int[] isPrimo() {
para

private static List isPrimo() {
renamed

E aqui está um exemplo com List…

package primos;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Scanner;


public class Princ {

	/**
	 * Manteremos, aqui, uma lista dos números primos que já conhecemos
	 */
	private static List<Integer> lstNumerosPrimosConhecidos = new ArrayList<Integer>();
	
	/**
	 * Aqui leremos dois limites, um inferior e outro superior e vamos calcular os números primos entre
	 * esse intervalo. Quando o limite for maior que o fim, saimos do loop 
	 */
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		
		System.out.print("Digite limite inferior: ");
		int comeco = Integer.parseInt(sc.nextLine());
		System.out.print("Digite limite superior: ");
		int fim = Integer.parseInt(sc.nextLine());
		
		while (comeco < fim){
			listaPrimos(comeco, fim);
			
			System.out.print("Digite limite inferior: ");
			comeco = Integer.parseInt(sc.nextLine());
			System.out.print("Digite limite superior: ");
			fim = Integer.parseInt(sc.nextLine());
		}

	}
	
	/**
	 * Lista todos os primos que estão no intervalo
	 */
	public static void listaPrimos(int comeco, int fim){
		for(int i = comeco; i < fim; i++){
			if (ehPrimo(i)){
				System.out.println(i);
			}
		}
	}
	
	/**
	 * Verifica se um número é primo. 
	 */
	public static boolean ehPrimo(int numero){
		
		/**
		 * A primeira coisa que fazemos é ordenar nossa lista de primos já conhecidos.
		 * Essa ordenação é necessária para realizarmos uma busca binária
		 */
		Collections.sort(lstNumerosPrimosConhecidos);
		/**
		 * Fazemos uma busca binária na nossa lista de números primos. Se a busca retornar maior que zero,
		 * o número já é um número primos conhecido, então retornamos true.
		 */
		if (Collections.binarySearch(lstNumerosPrimosConhecidos, numero) > 0){
			return true;
		}
		
		/**
		 * Se chegar aqui, ou o número é primo e não o conhecemos ou ele não é primo.
		 * Para verificar se um número é primo, basta procurar 
		 * até sua raiz quadrada, se até lá ele não for divisível por qualquer outro número além do 1, 
		 * ele não será por nenhum outro 
		 */
		int raiz = (int) Math.sqrt(numero);
		for(int i = 2; i <= raiz; i++){
			if ((numero % i) == 0){				
				return false;
			}
		}
		/**
		 * Se chegar aqui ele é primo e não o conhecíamos ainda, então o adicionamos na lista de primos
		 */
		lstNumerosPrimosConhecidos.add(new Integer(numero));
		return true;
	}

}

Se você quiser também pode criar uma lista de não primos, tentando evitar ao máximo que o algoritmo calcule valores repetidos (esse algoritmo sempre verifica se um número não primo é primo, isso seria evitado com essa nova lista)…

ok?

britotr

Perfeito cara… era isso mesmo que eu queria e consegui graças a ajuda de vocês… hehehe… valeu a todos!!!

pedroroxd

Depois só dá uma olhada de diferença entre Vector, ArrayList, int[]
Depois adiciona [RESOLVIDO] ao assunto do tópico

Criado 24 de abril de 2010
Ultima resposta 25 de abr. de 2010
Respostas 10
Participantes 4