while veces repetir objetos hacer for ejemplos crear con como bucle java arrays while-loop

java - veces - ¿Cómo asigno valores de matriz con un ciclo while?



repetir string n veces java (5)

En primer lugar, la longitud de una matriz no cambia. Entonces, cuando está probando primes.length > 200 esto siempre será falso, y el bucle nunca se ingresa. Por lo tanto, todos los valores en la matriz se dejan en el valor predeterminado de 0 .

Para hacer esto, haría algo como lo siguiente:

int primeCounter = 0; long current = 0L; while(primeCounter < primes.length){ if(isPrime(current)){ primes[primeCounter] = current; primeCounter++; } current++; }

Estoy tratando de hacer un ciclo while que itere a través de cada número largo posible y añada cada número primo que encuentre en una matriz de primos. Como se supone que el ciclo while se ejecuta hasta que la longitud de los primos sea 200, espero que el conjunto de primos se llene con los primeros 200 números primos. En cambio, obtengo todos los ceros. Conseguí con éxito 20 filas de 10 caracteres cada una con un espacio entre ellas. Sin embargo, ¿cómo puedo conseguir que sean los números primos reales?

public class PrimeGenerator { public static void main(String[] args) { long primes[] = new long[200]; while (primes.length > 200){ for(long y = 2; y < Long.MAX_VALUE; y++) { int primeCounter = 0; if (isPrime(y) == true){ primes[primeCounter] = y; primeCounter++; } } } for (int i = 0; i < 20; i++) { int primeCounter = 0; for(int p = 0; p < 10; p++) { System.out.print(primes[primeCounter] + " "); primeCounter++; } System.out.println(); } } public static boolean isPrime(long number) { if (number % 2 == 0) return false; if (number == 2) return true; for(int x = 3; x*x <= number; x+=2) { if (number%x == 0) return false; } return true; } }


La longitud de una matriz nunca cambia. Si declaraste que una matriz tiene una longitud de 200, siempre tendrá una longitud de 200. Debido a esto, tu ciclo while nunca se ejecuta, ni siquiera una vez.

Hay muchos otros errores en el código, así que traté de crear una solución con el menor número de cambios posibles:

public static void main(String[] args) { int primeCounter = 0; long nextPossiblePrime = 2; long primes[] = new long[200]; while (primeCounter < 200) { for (long y = nextPossiblePrime; y < Long.MAX_VALUE; y++) { if (isPrime(y) == true) { primes[primeCounter] = y; primeCounter++; nextPossiblePrime = y + 1; break; } } } primeCounter = 0; for (int i = 0; i < 20; i++) { for (int p = 0; p < 10; p++) { System.out.print(primes[primeCounter] + " "); primeCounter++; } System.out.println(); } } public static boolean isPrime(long number) { if (number == 2 || number == 3) return true; if (number % 2 == 0) return false; for (int x = 3; x * x <= number; x += 2) { if (number % x == 0) return false; } return true; }

El primer problema es que creó dos primeCounter s, que no es necesario. Quité el extra y moví su alcance al alcance del método. El siguiente problema es que su primer bucle for no recuerda el número primo en el que se encuentra y no se detiene cuando ha encontrado uno, por lo que seguirá añadiendo la primo 200 a la matriz. Lo arreglé agregando una nextPossiblePrime variable nextPossiblePrime que almacena qué número debería verificar el programa a continuación. El último problema es que su método isPrime está escrito incorrectamente. ¡Lo arreglé por ti!

Aquí hay otra solución (limpia), que todavía usa un ciclo while:

public static void main(String[] args) { ArrayList<Long> primes = new ArrayList<>(); long y = 2; while (y < Long.MAX_VALUE && primes.size() < 200) { if (isPrime(y) == true){ primes.add(y); } y++; } for (int i = 0; i < primes.size(); i++) { System.out.print(primes.get(i) + " "); if ((i+1) % 10 == 0) System.out.println(); } } public static boolean isPrime(long number) { if (number == 2 || number == 3) return true; if (number % 2 == 0) return false; for (int x = 3; x * x <= number; x += 2) { if (number % x == 0) return false; } return true; }


este código abajo

long primes[] = new long[200]; while (primes.length > 200){

medio

while (200 > 200){

o lo mismo que

while (false){

¡entonces tu ciclo NUNCA se ejecuta!


porque lo hiciste:

while (primes.length > 200)

y la longitud de la matriz es siempre 200, nunca ingresas en el ciclo while, y el cero en la matriz está llegando porque cuando creas una matriz de "larga" lo inicializó con ceros


primes.length siempre es 200, por lo while ciclo while nunca se ingresa.

El ciclo while es inútil. Simplemente agregue una condición al bucle for que saldría cuando se haya asignado toda la matriz. También mueva la inicialización de primeCounter para que esté fuera del ciclo for . De lo contrario, todos los números primos se asignarán a primes[0] .

long primes[] = new long[200]; int primeCounter = 0; for(long y = 2; y < Long.MAX_VALUE && primeCounter < 200; y++) { if (isPrime(y) == true){ primes[primeCounter] = y; primeCounter++; } } for (int i = 0; i < primes.length; i++) { System.out.print(primes[i]); if ((i+1) % 10 == 0) System.out.println(); }

EDITAR:

Como comentó Sweeper, también debería corregir su método isPrime , ya que devuelve false para 2 :

public static boolean isPrime(long number) { if (number == 2) return true; if (number % 2 == 0) return false; for(int x = 3; x*x <= number; x+=2) { if (number%x == 0) return false; } return true; }