- #include <math.h> //pour sqrt()
- #include <stdio.h>
- #include <stdlib.h>
-
- //Calcule le nombre de caractère d'une chaîne
- long longueurChaine(const char* chaine)
- {
- const char *c = chaine;
- while(*c) c++;
- return (c - chaine);
- }
-
- //Ajoute une chaîne à la suite d'une autre
- void addchaine(char* dest, const char* source)
- {
- while(*dest) dest++;
- while(*dest = *source)
- {
- dest++;
- source++;
- }
- }
-
- //Vérifie si le nombre est premier, renvoie 1 si vrai et 0 si faux
- int isPrime(long nombre)
- {
- if(nombre==1 || nombre==0)
- return 0;
- long i;
- //Verifie si le nombre a un diviseur autre que 1 et lui-même
- for(i = 2 ; i <= sqrt(nombre) ; i++)
- {
- if (nombre % i == 0)
- return 0;
- }
- return 1;
- }
-
- //Cherche la décomposition du nombre en puissance de facteurs premiers
- int factPrime(long nombre, char* chaine)
- {
- int k;
- //Efface la chaine
- for(k = 0 ; k < 100 ; k++)
- chaine[k]=0;
- char chainetmp[100]={'/0'};
- //Si le nombre est égale a 0, 1 ou est premier
- //il n'a pas de décomposition
- if (nombre == 0 || nombre == 1 || isPrime(nombre))
- sprintf(chaine,"%d", nombre) ;
- //Sinon
- else
- {
- long i;
- for(i = 2 ; i <= sqrt((double)nombre) ; i = i + 2)
- {
- int j = 0 ;
- //Calcule la puissance du diviseur en cour
- while (nombre % i == 0)
- {
- nombre /= i ;
- j++ ;
- }
- //Affiche le diviseur avec sa puissance
- if (nombre != 1)
- {
- if (j > 0)
- {
- if (j != 1)
- sprintf(chainetmp,"%ld^%d * ", i, j) ;
- if (j == 1)
- sprintf(chainetmp,"%ld * ", i) ;
- }
- }
- else
- //Affiche le dernier diviseur avec sa puissance (si different de 1)
- sprintf(chainetmp,"%ld^%d", i, j) ;
-
- if (i == 2)
- i--;
- if(j > 0)
- addchaine(chaine,chainetmp);
- int k;
- for(k = 0 ; k < 100 ; k++)
- chainetmp[k]=0;
- }
- //Affiche le dernier diviseur (si different de 1)
- if (nombre != 1)
- {
- sprintf(chainetmp,"%ld", nombre);
- addchaine(chaine,chainetmp);
- }
- }
- return 1;
- }
- int main()
- {
- long nb;
- char chaine[100]={0};
- printf("Entrez un nombre : ");
- scanf("%Ld",&nb);
- factPrime(nb,chaine);
- printf("%s\n",chaine);
- system("PAUSE");
- }
#include <math.h> //pour sqrt()
#include <stdio.h>
#include <stdlib.h>
//Calcule le nombre de caractère d'une chaîne
long longueurChaine(const char* chaine)
{
const char *c = chaine;
while(*c) c++;
return (c - chaine);
}
//Ajoute une chaîne à la suite d'une autre
void addchaine(char* dest, const char* source)
{
while(*dest) dest++;
while(*dest = *source)
{
dest++;
source++;
}
}
//Vérifie si le nombre est premier, renvoie 1 si vrai et 0 si faux
int isPrime(long nombre)
{
if(nombre==1 || nombre==0)
return 0;
long i;
//Verifie si le nombre a un diviseur autre que 1 et lui-même
for(i = 2 ; i <= sqrt(nombre) ; i++)
{
if (nombre % i == 0)
return 0;
}
return 1;
}
//Cherche la décomposition du nombre en puissance de facteurs premiers
int factPrime(long nombre, char* chaine)
{
int k;
//Efface la chaine
for(k = 0 ; k < 100 ; k++)
chaine[k]=0;
char chainetmp[100]={'/0'};
//Si le nombre est égale a 0, 1 ou est premier
//il n'a pas de décomposition
if (nombre == 0 || nombre == 1 || isPrime(nombre))
sprintf(chaine,"%d", nombre) ;
//Sinon
else
{
long i;
for(i = 2 ; i <= sqrt((double)nombre) ; i = i + 2)
{
int j = 0 ;
//Calcule la puissance du diviseur en cour
while (nombre % i == 0)
{
nombre /= i ;
j++ ;
}
//Affiche le diviseur avec sa puissance
if (nombre != 1)
{
if (j > 0)
{
if (j != 1)
sprintf(chainetmp,"%ld^%d * ", i, j) ;
if (j == 1)
sprintf(chainetmp,"%ld * ", i) ;
}
}
else
//Affiche le dernier diviseur avec sa puissance (si different de 1)
sprintf(chainetmp,"%ld^%d", i, j) ;
if (i == 2)
i--;
if(j > 0)
addchaine(chaine,chainetmp);
int k;
for(k = 0 ; k < 100 ; k++)
chainetmp[k]=0;
}
//Affiche le dernier diviseur (si different de 1)
if (nombre != 1)
{
sprintf(chainetmp,"%ld", nombre);
addchaine(chaine,chainetmp);
}
}
return 1;
}
int main()
{
long nb;
char chaine[100]={0};
printf("Entrez un nombre : ");
scanf("%Ld",&nb);
factPrime(nb,chaine);
printf("%s\n",chaine);
system("PAUSE");
}