[Help] Programme nbr premier en c#

Programme nbr premier en c# [Help] - C#/.NET managed - Programmation

Marsh Posté le 04-01-2006 à 14:53:12    


Bonjour,  
 
Voila mon probleme, je cherche a afficher les nombres premiers a partir du nombre 10 en C# et je ne comprends pas ou est l'erreur dans mon programme pour que celui ci affiche certain nombre qui ne sont pas premier.
 
------------------------------------
using System;
 
class NombrePremier {
 
 static void Main(){
  int [] diviseurs = {2,3,5,7};
  int i = 10, j ;
 
   
  while ( i<= 2000){
   
   for(j =0; j<=3;j++){
    if (i % diviseurs[j] == 0) i++;
    else if ( j == 3){
     Console.WriteLine( i +" est premier" );
     i++;}
   }
  }
 }  
}  
---------------------------------------
 
Affichage :
 
 
11 est premier
13 est premier
16 est premier
17 est premier
19 est premier
22 est premier
23 est premier
26 est premier
29 est premier
31 est premier
34 est premier
36 est premier
37 est premier  
...
 

Reply

Marsh Posté le 04-01-2006 à 14:53:12   

Reply

Marsh Posté le 04-01-2006 à 15:23:19    

Code :
  1. using System;
  2. namespace NombrePremier
  3. {
  4. class MainClass
  5. {
  6.  public static void Main(string[] args)
  7.  {
  8.   int [] diviseurs = {2,3,5,7};
  9.      int i = 10, j ;
  10.    while(i<100){
  11.        for(j =0; j<=3;j++){
  12.      if(i%diviseurs[j] == 0){
  13.       break;
  14.      }
  15.      if(j==3){
  16.       Console.WriteLine(i + " est premier" );
  17.      }
  18.        }
  19.     i++;
  20.    }
  21.  }
  22. }
  23. }


 
ca fonctionne mieux je trouve...

Reply

Marsh Posté le 05-01-2006 à 00:27:15    

merci ;)

Reply

Marsh Posté le 09-01-2006 à 12:12:37    

Au risque de paraître chiant :
les break dans une boucle c'est mal.
 
Ca fonctionne, mais c'est une sale habitude : au niveau compréhension et lisibilité c'est vachement mieux de centraliser toutes tes conditions de sortie de ta boucle au début, plutôt que d'avoir systématiquement à relire toute la boucle pour comprendre.
 
Chui sur que ça va faire râler des gens ce que je dis là ("ouais tu fais chier, ca marche, on s'en branle" ), mais vous comprendrez quand vous aurez à relire le code de qqn de brouillon, ou à devoir comprendre 20 pages de codes en 10mn...

Code :
  1. while(i<100)
  2. {
  3. int j = 0;
  4. while((j <= 3)
  5.  && (i%diviseurs[j] != 0))
  6. {
  7.  if(j==3)
  8.  {
  9.   Console.WriteLine(i + " est premier" );
  10.  }
  11.  j++;
  12. }
  13. i++;
  14. }


---------------
Tout est normal, suffit de comprendre pourquoi.
Reply

Marsh Posté le 03-07-2006 à 09:43:52    

Je suis désole, je viens de tester vos sources & elles ne fonctionnent pas. Le problème c'est que vous limité la recherche du nombre : vous supprimer seulement les nombre divisible par 2,3,5,7 or en faisant ça, vous n'obtenez pas que des premiers, car vous obtenez 121 & 11*11=121, vous obtenez également 377 & 29*13=377.
 
   ulong [] diviseurs = {2,3,5,7,11};  
   int z;
   ulong y = 1;
 
   for ( y=10000000001; y<= 10000001003 ; y=y+2) // valeur à modif
   {  
     
    for(z =0; z<=4;z++)
    {  
     if (y % diviseurs[z] == 0)
     {
      break;
     }
 
     if ( z == 4)
     {  
      double dRac = Math.Pow(y, 0.5);
      ulong uiEntree= ((ulong)dRac + 1);
      byte bVerif = 0;
      double dJ = (y / 2) + 1 ;
      richTextBox1.Text = "" ;
 
 
      if ((ulong)dRac == dRac)
      {
       richTextBox1.Text="Le Nombre : " +y +" N'est Pas Premier : " + dRac + " * " + dRac + " = " + y ;
      }
 
      else
      {
       for (ulong i=2; i<=uiEntree; i++)
       {
        for (ulong j=2; j<=(ulong)dJ; j++)
        {
         if ((i * j) == (y))
         {
          richTextBox1.Text="Le Nombre N'est Pas Premier : " +i +"*" +j +" = " +y;
          i = uiEntree;
          j = y;
          bVerif = 1;
         }
         if (i==uiEntree && j==(ulong)dJ && bVerif==0)
         {
          richTextBox1.Text="\n" +y; //  
          bVerif = 1;
          string sIn = richTextBox2.Text;
          richTextBox2.Text= sIn + richTextBox1.Text;
         }
        }
       }
      }
     }
    }
    y++;
   }
  }
 
Cette source que j'ai réalisé (en insérant la votre au dessus) trouve vraiment les nombres premiers. Le seul problème c'est que ça prend beaucoup de temps, mais vous êtes sur à 100% que le nombre soit premier, car le programme va rechercher 2 nombres pour former le soit disant premier.

Reply

Marsh Posté le 03-07-2006 à 12:25:58    

Un des algo les plus rapides pour les nombres premiers : l'algorithme du 'crible d'Eratostène'

Code :
  1. /// <summary>
  2. /// Affichage du résultat
  3. /// </summary>
  4. public void AfficheNombresPremiers()
  5. {
  6. Console.WriteLine("== nombres premiers ===" );
  7. int []retour = this.CalculeNombresPremiers(1000);
  8. for(int i = 0; i < retour.Length; i++)
  9. {
  10.  if(retour[i] == 1)
  11.   Console.WriteLine(i);
  12. }
  13. }
  14. /// <summary>
  15. /// Calcule des nombres premiers jusuq'à la valeur max donnée
  16. /// </summary>
  17. /// <param name="max">L'algo calcul jusqu'à la valeur max donnée</param>
  18. public int []CalculeNombresPremiers(int max)
  19. {
  20. // initialisation
  21. int[] retour = new int[max];
  22. for(int i = 2; i < retour.Length; i++)
  23.  retour[i] = 1;
  24. // calcul
  25. for(int i = 2; i < retour.Length; i++)
  26. {
  27.  if(retour[i] == 1)
  28.  {
  29.   for(int j = i; i*j < retour.Length; j++)
  30.    retour[i*j] = 0;
  31.  }
  32. }
  33. return retour;
  34. }

Reply

Marsh Posté le 03-07-2006 à 12:31:35    

ne doit-on pas aller jusqu'à sqrt(max) ?
 
à lire http://en.wikipedia.org/wiki/Prime_number


---------------
What if I were smiling and running into your arms? Would you see then what I see now?  
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed