Le code de publication précédente est un code coûteux qui "recherche toute la liste, la divise et la tamise" comme le souligne @swordone. Cela s'est avéré. Donc, sur la base de l'indice de @swordone, j'ai apporté une correction majeure au code.
Les différences avec le code précédent sont les suivantes.
List <Integer>
à boolean []
.PrimeNumberFinder.java
static void printPrimeNumbers2(int maxNumber) {
//Étape 1: Mettez "entier de 2 à la limite supérieure" dans la liste de recherche.
boolean[] targetNumbers = new boolean[maxNumber + 1];
Arrays.fill(targetNumbers, true);
targetNumbers[0] = false;
targetNumbers[1] = false;
//Liste des nombres premiers
List<Integer> primeNumbers = new ArrayList<Integer>();
int sqrt = (int) Math.sqrt(maxNumber);
//Étape 3: Continuez l'opération de tamisage jusqu'à ce que la première valeur de la liste de recherche atteigne la racine carrée de l'argument.
for(int i=2; i<=sqrt; i++) {
//Étape 2: Faites du premier nombre de la liste de recherche un nombre premier et des multiples d'écran de la liste de recherche.
//* Pour le moment, le numéro qui a déjà été exclu (faux) est exclu.
int firstNum = i;
if (targetNumbers[i]) {
for (int j=i*firstNum; j<targetNumbers.length; j+=firstNum) {
targetNumbers[j] = false;
}
}
}
//Étape 4: Déplacez les valeurs restantes dans la liste de recherche vers la liste des nombres premiers et terminez le processus.
for (int i=2; i<targetNumbers.length; i++) {
if (targetNumbers[i]) {
primeNumbers.add(i);
}
}
//Affichage des nombres premiers
System.out.println(primeNumbers.stream().map(pNum -> pNum.toString()).collect(Collectors.joining("\t")));
}
La limite supérieure est |
La limite supérieure est |
La limite supérieure est |
La limite supérieure est |
|
---|---|---|---|---|
Dernier code | 54ms | 55ms | 61ms | 102ms |
Ce code | 0ms | 1ms | 1ms | 9ms |
Recommended Posts