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
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 **************/