Enregistre dans une chaîne de caractère la décomposition d'un nombre en paramètres en facteurs premiers.
le code est accompagne de deux fonctions qui ont leur equivalent dans string.h:
addchaine() -> strcat()
longeurChaine() -> strlen()
(il est fort possible que vous les connaissiez)
isPrime() verifie si le nombre est premier.
Source / Exemple :
#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");
}
Conclusion :
c'est ma premiere source
Vous n'êtes pas encore membre ?
inscrivez-vous, c'est gratuit et ça prend moins d'une minute !
Les membres obtiennent plus de réponses que les utilisateurs anonymes.
Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.
Le fait d'être membre vous permet d'avoir des options supplémentaires.