J
joel.foutelet
Hello everybody
This code is intended to compute the number of partitions of a number.
see this link : http://en.wikipedia.org/wiki/Integer_partition
void partition(int n)
{
// total decrit la somme des nombres du tableau indice 0..ptcur
int total;
// prcur nombre d'elements utilises dans le tableau tab
int ptcur;
// nombre de partitions
int nb ;
// compteur de boucle pour l'initialisation
int i;
// tableau decrivant une solution
int *tab = malloc(n * sizeof(int));
if (tab == NULL)
{
fprintf(stderr, "Pb alloc memoire\n");
return;
}
// initialisation : la premiere partition n'est composee que de 1
for(i = 0; i < n; i++)
tab = 1;
nb = 1;
total = n;
ptcur = n-1;
// la boucle infernale
while (tab[0] != n)
{
if (total > n)
{
// on revient un cran en arrière
// et on augmente la valeur pointee
// car il n'y a pas de solution avec cette valeur
// a ce rang
total -= tab[ptcur];
--ptcur;
++tab[ptcur];
++total;
}
else
if (total == n)
{
// on a trouve une solution
// edit(tab, ptcur);
++nb;
// on revient un cran en arrière
// et on augmente la valeur pointee
// car on a epuise toutes les solutions avec cette valeur
// a ce rang
total -= tab[ptcur];
--ptcur;
++tab[ptcur];
++total;
}
else
{
// on avance d'un cran
++ptcur;
// un nombre du tableau est toujours superieur
// ou egal a ses precedents
tab[ptcur] = tab[ptcur-1];
total += tab[ptcur];
}
}
printf("Nombre de solutions %d\n", nb);
free(tab);
}
The loop while is executed à very big number of times (for n = 100
much more than 190,569,292 times which is the number of partitions of
100).
Is it possible to improve this code (not the algorithm) ?
e-g : is ++total faster than total++ in the absolute ?
is it better to compute r = total - n and test r > 0 and r == 0 or
test total > n and total == n ?
I can't test really on my system (Vista) cause of the multiprocessing,
sometimes it gaves me 11s or 13s for the same code and number 100.
Thank you for the hints.
This code is intended to compute the number of partitions of a number.
see this link : http://en.wikipedia.org/wiki/Integer_partition
void partition(int n)
{
// total decrit la somme des nombres du tableau indice 0..ptcur
int total;
// prcur nombre d'elements utilises dans le tableau tab
int ptcur;
// nombre de partitions
int nb ;
// compteur de boucle pour l'initialisation
int i;
// tableau decrivant une solution
int *tab = malloc(n * sizeof(int));
if (tab == NULL)
{
fprintf(stderr, "Pb alloc memoire\n");
return;
}
// initialisation : la premiere partition n'est composee que de 1
for(i = 0; i < n; i++)
tab = 1;
nb = 1;
total = n;
ptcur = n-1;
// la boucle infernale
while (tab[0] != n)
{
if (total > n)
{
// on revient un cran en arrière
// et on augmente la valeur pointee
// car il n'y a pas de solution avec cette valeur
// a ce rang
total -= tab[ptcur];
--ptcur;
++tab[ptcur];
++total;
}
else
if (total == n)
{
// on a trouve une solution
// edit(tab, ptcur);
++nb;
// on revient un cran en arrière
// et on augmente la valeur pointee
// car on a epuise toutes les solutions avec cette valeur
// a ce rang
total -= tab[ptcur];
--ptcur;
++tab[ptcur];
++total;
}
else
{
// on avance d'un cran
++ptcur;
// un nombre du tableau est toujours superieur
// ou egal a ses precedents
tab[ptcur] = tab[ptcur-1];
total += tab[ptcur];
}
}
printf("Nombre de solutions %d\n", nb);
free(tab);
}
The loop while is executed à very big number of times (for n = 100
much more than 190,569,292 times which is the number of partitions of
100).
Is it possible to improve this code (not the algorithm) ?
e-g : is ++total faster than total++ in the absolute ?
is it better to compute r = total - n and test r > 0 and r == 0 or
test total > n and total == n ?
I can't test really on my system (Vista) cause of the multiprocessing,
sometimes it gaves me 11s or 13s for the same code and number 100.
Thank you for the hints.