Décomposition d'un nombre en puissance de facteurs premiers

Soyez le premier à donner votre avis sur cette source.

Snippet vu 7 265 fois - Téléchargée 26 fois

Contenu du snippet

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

A voir également

Ajouter un commentaire

Commentaires

Messages postés
21042
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
20
Je trouve très bien qu'on n'ait pas changé les tailles.
J'exclus le 16 bits de la discussion.
Quand je vois int ou long dans un code, je sais que c'est 32 bits, je ne veux pas avoir à me poser la question du system cible, 32 ou 64 ces types seront définitivement 32 bits.
En prog Windows on n'a jamais employé 'long long' et autres bidules à rallonge, on emploie __int64, INT_PTR etc... le prob ne se pose donc pas car sont peut-être pas futés chez MS mais il y a tout de même de la continuité prévue.
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

Ça n'a aucun lien avec l'OS il me semble, c'est seulement lié au compilateur. Pas besoin de transformer ça en troll linux.

Et éviter des problèmes de portage aussi importants que les types des int pour un langage (et un compilo) qui concerne quelques milliards sans doute de lignes de code, ça me paraît ... raisonnable.
Messages postés
402
Date d'inscription
mardi 1 mai 2001
Statut
Membre
Dernière intervention
15 août 2011

aujourd'hui y'a plus que le 32 bits, le 64 bits est arrivé

sous Windows 64 => int = 32 et long int = 32
microsoft avait utilisé int/long int à la random et donc voilà le résultat, il ne veut pas changer pour éviter les problèmes de portage 32 => 64

sous Linux 64 => int = 32 et long int = 64
linux a été plus intelligent et avait utilisé la règle des sizeof() mentionné par MATT67 plus haut

faut pas oublier qu'il n'y a que sous 32 bit où sizeof(int) == sizeof(long int)
sous Windows 16 bits par exemple, sizeof(int) était différent de sizeof(long int)

leurs tailles n'est pas fixes d'une platforme à une autre ...
Messages postés
3006
Date d'inscription
dimanche 14 avril 2002
Statut
Membre
Dernière intervention
31 décembre 2008

C'est exact, mais dans la pratique, pour les compilos 32 bits que je connais, on a la propriété énoncée. Il y a le standard qui ne précise pas grand chose, et la réalité du terrain :) Si tu as besoin d'être sûr, une batterie de typedefs devraient faire l'affaire, non?

Enfin, je vais pas te reprocher de faire une précision, c'est tjs bon à prendre ^^.
Messages postés
549
Date d'inscription
samedi 6 septembre 2003
Statut
Membre
Dernière intervention
6 mars 2010

Bonsoir,

Kirua a dit : "long et int c'est pareil Joky [..]"

euh, je suis pas tout a fait d'accord : sizeof(short int) <= sizeof(int) <= sizeof(long int).
Il se peut que sizeof(int) == sizeof(long int) mais il se peut aussi que sizeof(int) != sizeof(long int).

Matt...
Afficher les 14 commentaires

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.