calcul de nombre premier factorisation code en c







                                         DESCRIPTION






  • C'est un programme qui regroupe trois fonctions : 
  • - La recherche de nombre premiers jusqu’à une limite 
  • - Le test d'un nombre (premier ou pas) 
  • - La séparation d'un nombre en facteur premiers 
L'optimisation n'a pas encore été effectuée (je suis sur qu'il en reste a optimiser)     


                                    code source  

 ///Author: Karara Mohamed  @   tutodev1.blogspot.com/
#include <windows.h>     /* Pour la taille de l'écran */
#include <stdio.h>
#include <math.h>        /* Pour les racines carrés */
#include <time.h>        /* Pour les calculs de temps */

void Redim_ecran(void);                  /* Redimensionnement de l'écran */
void Calcul_Nbre_Prem(int);              /* Calcul de nombre premiers */
void Temps(int);                         /* Compte du temps */
int Prem_ou_Pas(int nbre);               /* Test d'un nombre */
void Factoris(int nbre);                 /* Factorisation */
int Demand_Nbre(int choix);              /* Demande d'un nombre */


/**************************Fonction principale******************************/
main()
{
     int choix, nbre;

debut:
      choix = NULL;        /* évite, en cas d'erreur, le fait de passer le scanf() */
      Redim_ecran();       /* Agrandit un peu l'écran */
      system("CLS");       /* Efface l'écran */
      printf("                                     NOMBRES PREMIERS\n\n");
      printf("Tapez 1 pour chercher une liste de nombres premiers de 0 a un maximum\n");
      printf("Tapez 2 pour verifier qu'un nombre est premier\n");
      printf("Tapez 3 pour factoriser un nombre\n");
      printf("Sinon, tapez une autre touche\n");
      printf("\nVotre choix :");
      scanf("%d", &choix);         /* Demande du choix et  enregistrement */

      if ((choix!=1) && (choix!=2) && (choix !=3))         /* vérifie que le choix est bien possible */
      {    printf("Erreur, votre choix n'est pas possible\n");
           system("PAUSE");
           goto debut;
      }
      else nbre = Demand_Nbre(choix);                 /* Demande du nombre (ex : maximum recherché ... etc) */

      if (choix==1) Calcul_Nbre_Prem(nbre);           /* Execution de la fonction selon le choix */

      if (choix==2)
         if (Prem_ou_Pas(nbre)==1)
            printf("%d est premier", nbre);
         else
            printf("%d n'est pas premier", nbre);

      if (choix==3) Factoris(nbre);

      printf("\n");
      system("PAUSE");                               /* Fin du programme */
      return 0;
}
/********************* Fin de la fonction principale ***********************/

/********************** Fonction de demande d'un nombre ********************/
int Demand_Nbre(int choix)
{
   int nombre;

system("CLS");
if (choix==1) printf("Entrez le nombre maximum de recherche :");
if (choix!=1) printf("Entrez le nombre a evaluer :");


scanf("%d", &nombre);
      return nombre;
}
/********************** Fin de la fonction de demande d'un nombre ********************/


/********************** Fonction test un nombre ***************************/
int Prem_ou_Pas(int nbre)
{
  int j, prem=1;

if (nbre%2 == 0) {
      prem = 0;
      goto fin;
}

for(j=3; j<nbre; j=j+2){
   if (nbre%j==0){
      prem = 0;
 
    goto fin;
   }
}

fin:
  return prem;
}
/***************** Fin de la fonction de test d'un nombres ***************/



/******************* Fonction de factorisation d'un nombre ****************/
void Factoris(int nbre)
{
   int j=1;

if (Prem_ou_Pas(nbre)==1){
   printf("%d est premier !", nbre);
   goto fin;
}

printf("%d =", nbre);

debut:
    j++;
    if (j>nbre) goto fin;
    if (nbre%j==0){
      printf(" %d ", j);
      if (Prem_ou_Pas(nbre)==0) printf("x");
      nbre /= j;
      j = 1;
    }
goto debut;
fin:{}
}
/***************** Fin de la fonction de factorisation ***************/



/**********************Fonction calcul du temps******************************/
void Temps(int test)
{
     static time_t depar, fini;

     if (test==1) time(&depar);
     if (test==2){
         time(&fini);
         printf("\n\nTemps pour le calcul : %d sec\n", fini - depar);
     }
}
/*********************Fin de la fonction de calcul du temps*******************/





/**********************Fonction calcul des nombres****************************/
void Calcul_Nbre_Prem(int nbre)
{
FILE *fptr;
char tablo[10], fname[]= "c:/Nombres Premiers.txt";
int fin, nbr=0, i=1, j;
double maxj;


/*Initialisation des variables*/
maxj = sqrt(nbre);

/* --> Le deux n'est pas pris en compte (i est impair, 2 est pair :*/
                                  /*cela ralentirai la vitesse du programme)*/

/* Gestion du fichier */
fptr = fopen(fname, "w");            /* Ouverture */
     fprintf(fptr, "%d\n", 2);       /* Ecriture du 2 */

printf("Recherche en cours ... veuillez patienter svp");
Temps(1);           /*Appel pour calcul du temps*/


/*Et c'est parti ...|| n'appelle pas Prem_ou_Pas car, ici, exclue le deux (pas dans la fonction) */
debut:
    i = i + 2;                   /*incrémentation du nombre testé*/
    if (i>nbre) goto sortie;      /*sortie si depasse la limite fixée*/
    for (j=3; j<maxj; j=j+2){
         if((i%j==0) && (i!=j)) goto debut;         /*recommence si le chiffre*/
    }                                        /*est divisible par un autre chiffre*/
    nbr++;                              /*sinon, incremente le compte de chiffres*/
    fprintf(fptr, "%d\n", i);               /*et ecrit dans le fichier*/
goto debut;

                /*Pour sortir à la fin des calculs*/
sortie:
      fclose(fptr);                      /*ferme le fichier*/
      Temps(2);                          /*affiche le temps*/
      printf("\nNombre de chiffres trouves : %d\n", nbr);
      printf("Le fichier contenant tout les nombres se situe dans C:/\n");
}
/****************** Fin de la fonction de calcul des nombres ***************/



/******************* Fonction redimensionne l'écran ************************/
void Redim_ecran(void)
{
const HANDLE MaConsoleEcran =  GetStdHandle(STD_OUTPUT_HANDLE);

      COORD MaTailleEcran = {90,30};
      SMALL_RECT MonRectangle = {0,0,90-1,30-1};


      SetConsoleScreenBufferSize (MaConsoleEcran,MaTailleEcran);
      SetConsoleWindowInfo(MaConsoleEcran,TRUE,&MonRectangle);
}
/*************** Fin de la fonction de redimension de l'écran **************/