acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 2014
-
5 mai 2008 à 10:24
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 2014
-
6 mai 2008 à 15:12
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 6 mai 2008 à 15:12
wops c'est
while(!(n%d)) {
puissance_facteurs_premiers[nb]++;
n /= d;
}
et pas
while(!(n%d)) {
puissance_facteurs_premiers[nb]++;
n /= 2;
}
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 6 mai 2008 à 13:29
salut
j'ai recodé ton programme comme je l'aurais fait, à toi de voir si c'est plus clair
#include <stdio.h>
#define MAX 10
void decomposer(int n, int *facteurs_premiers, int *puissance_facteurs_premiers, int *nombre_facteurs_premiers) {
int nb 0, d 3;
printf("%d = ",n);
if (!(n%2)) {
facteurs_premiers[0] = 2;
puissance_facteurs_premiers[0] = 1;
n /= 2;
while(!(n%2)) {
puissance_facteurs_premiers[0]++;
n /= 2;
}
printf("2^%d * ", puissance_facteurs_premiers[0]);
nb = 1;
}
while(n != 1) {
if (!(n%d)) {
facteurs_premiers[nb] = d;
puissance_facteurs_premiers[nb] = 1;
n /= d;
while(!(n%d)) {
puissance_facteurs_premiers[nb]++;
n /= 2;
}
printf("%d^%d * ", d, puissance_facteurs_premiers[nb]);
nb++;
}
d += 2;
}
*nombre_facteurs_premiers = nb;
}
void enumerer_diviseurs(int *facteurs_premiers, int *puissance_facteurs_premiers, int nombre_facteurs_premiers, int diviseur, int *somme_diviseurs) {
int i;
if (nombre_facteurs_premiers == 0) { *somme_diviseurs += diviseur; printf("%d\n", diviseur); return; }
for (i = 0; i <= *puissance_facteurs_premiers; i++) {
enumerer_diviseurs(facteurs_premiers+1,puissance_facteurs_premiers+1, nombre_facteurs_premiers-1,diviseur,somme_diviseurs);
diviseur *= *facteurs_premiers;
}
}
int main(int argc, char* argv[])
{
int facteurs_premiers[MAX],puissance_facteurs_premiers[MAX],nombre_facteurs_premiers, Nombre, somme_diviseurs;
while(1)
{
printf("Veuillez entrer le nombre a decomposer \n");
scanf("%d",&Nombre);
printf("\n");
decomposer(Nombre,facteurs_premiers, puissance_facteurs_premiers, &nombre_facteurs_premiers);
somme_diviseurs = 0;
printf("\ndiviseurs:\n");
enumerer_diviseurs(facteurs_premiers, puissance_facteurs_premiers, nombre_facteurs_premiers, 1, &somme_diviseurs);
printf("\n\nLa partie Aliquote du nombre est %ld",somme_diviseurs);
printf("\n\n");
}
return 0;
}
jimonnet
Messages postés10Date d'inscriptionmardi 25 septembre 2007StatutMembreDernière intervention 6 mai 2008 6 mai 2008 à 11:19
oui en effet
mais les cas sont tres rare
2 ou 3 inferieur a 10^10
or le logiciel ne depasse pas les 10^10
sans risque de bug
en fait ce bout de programme est le debut d'un autre
que je posterai plus tard car pas au point
et qui ne sera pas penalisé par ce souci
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 5 mai 2008 à 21:21
la fonction diviseurs()
et s'il y a plus que 7 diviseurs ?
exemple 223092870 = 2*3*5*7*11*13*17*19*23
jimonnet
Messages postés10Date d'inscriptionmardi 25 septembre 2007StatutMembreDernière intervention 6 mai 2008 5 mai 2008 à 12:21
Ha bon...
lesquels ??
acx01b
Messages postés280Date d'inscriptiondimanche 7 septembre 2003StatutMembreDernière intervention 8 juillet 20146 5 mai 2008 à 10:24
salut
il y a des trucs un peu bizarres (au niveau algorithmique et clarté) dans ton code!
6 mai 2008 à 15:12
while(!(n%d)) {
puissance_facteurs_premiers[nb]++;
n /= d;
}
et pas
while(!(n%d)) {
puissance_facteurs_premiers[nb]++;
n /= 2;
}
6 mai 2008 à 13:29
j'ai recodé ton programme comme je l'aurais fait, à toi de voir si c'est plus clair
#include <stdio.h>
#define MAX 10
void decomposer(int n, int *facteurs_premiers, int *puissance_facteurs_premiers, int *nombre_facteurs_premiers) {
int nb 0, d 3;
printf("%d = ",n);
if (!(n%2)) {
facteurs_premiers[0] = 2;
puissance_facteurs_premiers[0] = 1;
n /= 2;
while(!(n%2)) {
puissance_facteurs_premiers[0]++;
n /= 2;
}
printf("2^%d * ", puissance_facteurs_premiers[0]);
nb = 1;
}
while(n != 1) {
if (!(n%d)) {
facteurs_premiers[nb] = d;
puissance_facteurs_premiers[nb] = 1;
n /= d;
while(!(n%d)) {
puissance_facteurs_premiers[nb]++;
n /= 2;
}
printf("%d^%d * ", d, puissance_facteurs_premiers[nb]);
nb++;
}
d += 2;
}
*nombre_facteurs_premiers = nb;
}
void enumerer_diviseurs(int *facteurs_premiers, int *puissance_facteurs_premiers, int nombre_facteurs_premiers, int diviseur, int *somme_diviseurs) {
int i;
if (nombre_facteurs_premiers == 0) { *somme_diviseurs += diviseur; printf("%d\n", diviseur); return; }
for (i = 0; i <= *puissance_facteurs_premiers; i++) {
enumerer_diviseurs(facteurs_premiers+1,puissance_facteurs_premiers+1, nombre_facteurs_premiers-1,diviseur,somme_diviseurs);
diviseur *= *facteurs_premiers;
}
}
int main(int argc, char* argv[])
{
int facteurs_premiers[MAX],puissance_facteurs_premiers[MAX],nombre_facteurs_premiers, Nombre, somme_diviseurs;
while(1)
{
printf("Veuillez entrer le nombre a decomposer \n");
scanf("%d",&Nombre);
printf("\n");
decomposer(Nombre,facteurs_premiers, puissance_facteurs_premiers, &nombre_facteurs_premiers);
somme_diviseurs = 0;
printf("\ndiviseurs:\n");
enumerer_diviseurs(facteurs_premiers, puissance_facteurs_premiers, nombre_facteurs_premiers, 1, &somme_diviseurs);
printf("\n\nLa partie Aliquote du nombre est %ld",somme_diviseurs);
printf("\n\n");
}
return 0;
}
6 mai 2008 à 11:19
mais les cas sont tres rare
2 ou 3 inferieur a 10^10
or le logiciel ne depasse pas les 10^10
sans risque de bug
en fait ce bout de programme est le debut d'un autre
que je posterai plus tard car pas au point
et qui ne sera pas penalisé par ce souci
5 mai 2008 à 21:21
et s'il y a plus que 7 diviseurs ?
exemple 223092870 = 2*3*5*7*11*13*17*19*23
5 mai 2008 à 12:21
lesquels ??
5 mai 2008 à 10:24
il y a des trucs un peu bizarres (au niveau algorithmique et clarté) dans ton code!