Un programme qui détermine si un nombre est un nombre premier ou un nombre non primaire. (Prend en charge C #, Java, C ++) Je l'ai fait parce que cela apparaît souvent comme un problème dans les concours de programmation tels que CodeIQ.
public static bool IsPrime(int num)
{
if (num < 2) return false;
else if (num == 2) return true;
else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance
double sqrtNum = Math.Sqrt(num);
for (int i = 3; i <= sqrtNum; i += 2)
{
if (num % i == 0)
{
//Pas un nombre premier
return false;
}
}
//Est un nombre premier
return true;
}
Si possible, je veux garder le code dans la plage que je peux comprendre, donc je l'utilise actuellement comme la version la plus rapide. (C'est facile, non?) Cependant, je pense que cette vitesse est suffisante pour résoudre le problème. Si cela ne suffit pas, détrompez-vous.
public static boolean isPrime(int num) {
if (num < 2) return false;
else if (num == 2) return true;
else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance
double sqrtNum = Math.sqrt(num);
for (int i = 3; i <= sqrtNum; i += 2)
{
if (num % i == 0)
{
//Pas un nombre premier
return false;
}
}
//Est un nombre premier
return true;
}
#include <math.h>
bool IsPrime(int num)
{
if (num < 2) return false;
else if (num == 2) return true;
else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance
double sqrtNum = sqrt(num);
for (int i = 3; i <= sqrtNum; i += 2)
{
if (num % i == 0)
{
//Pas un nombre premier
return false;
}
}
//Est un nombre premier
return true;
}
Je vais expliquer brièvement les termes que je n'ai pas compris.
Pour l'algorithme mis en œuvre, je me suis principalement référé au contenu de ce site. Jugement du nombre premier|Algorithme et structure des données| Aizu Online Judge
Sur ce site ** Dans le jugement des nombres premiers, la propriété que «le nombre composé x a un facteur premier p qui satisfait p ≤ √ x» peut être utilisée. ** ** Il y a une description, "Le nombre composé x a un facteur premier p qui satisfait p≤√x" = "Si x est un nombre composé, il a une fraction inférieure ou égale à √x" </ u> En d'autres termes, la condition de fin de boucle dépend de Math.Sqrt (num). Par rapport à la simple exécution du calcul du reste jusqu'à num, le nombre de boucles est réduit et la vitesse de traitement est considérablement réduite.
Il semble qu'il existe à peu près deux types d'algorithmes de jugement des nombres premiers. --Méthode de jugement des nombres premiers décisifs
La méthode de jugement définitive consiste à juger un nombre premier par une méthode qui ne provoque sûrement pas d'erreur. La méthode de jugement probabiliste est une méthode dans laquelle la vitesse de jugement est considérablement augmentée, bien que des erreurs puissent survenir occasionnellement.
Le représentant de la méthode de jugement définitif des nombres premiers est la "méthode de jugement des nombres premiers AKS" Une méthode typique de jugement de primalité probabiliste est le "test de primalité de Miller-Rabin".
Si vous avez besoin d'une implémentation plus rapide, pensez-y aussi.
La plupart des gens trouveront cette page inutile s'ils connaissent l'algorithme le plus rapide ci-dessus. Veuillez lire ce qui suit uniquement pour ceux qui souhaitent voir le processus de mise en œuvre menant à l'algorithme le plus rapide.
Une technique puissante pour vérifier s'il est réellement divisible tout en augmentant le nombre à diviser par un. J'ai trouvé cette méthode moi-même, mais c'était trop lent.
private static bool IsPrime(int num)
{
if (num < 2) return false;
for (int i = 2; i < num; i++)
{
if (num % i == 0)
{
//Pas un nombre premier
return false;
}
}
//Est un nombre premier
return true;
}
Avec un peu d'ingéniosité dans une mise en œuvre simple, la vitesse de traitement sera divisée par deux. En termes simples, nous savons que les valeurs égales sont divisibles par 2, alors supprimons-les à l'avance. De même, il semble que les multiples de 3 et 5 peuvent être supprimés à l'avance, mais cela ne semble pas être aussi beaucoup plus rapide.
private static bool IsPrime(int num)
{
if (num < 2) return false;
else if (num == 2) return true;
else if (num % 2 == 0) return false; //Exclure les nombres pairs à l'avance
for (int i = 3; i < num; i+=2)
{
if (num % i == 0)
{
//Pas un nombre premier
return false;
}
}
//Est un nombre premier
return true;
}
Premier jugement-Wikipedia Jugement du nombre premier|Algorithme et structure des données| Aizu Online Judge
Recommended Posts