Si je le compile en C ou en C++, je n'obtiens pas le même
résultat. En C++ fonctionne comme attendu, en C, j'ai un seg fault
(runtime error)
Voyez-vous une raison ?
Cordialement,
David
#include <stdio.h>
int Max( int i, int j ) { return ( i > j ? i : j ); }
int Min( int i, int j ) { return ( i < j ? i : j ); }
int CycleLength( int n ) {
int cycleLength = 1;
while ( n != 1 ) {
if ( n &0x01 ) n = 3*n + 1;
else n >>= 1;
++cycleLength;
}
return cycleLength;
}
int maxCycle( int i, int j ){
int max = CycleLength( i++ );
for( ;i <= j; ++i )
max = Max( max, CycleLength( i ) );
return max;
}
int main()
{
int i, j;
while( fscanf(stdin, "%d %d\n", &i, &j ) == 2 )
fprintf(stdout, "%d %d %d\n", i, j ,
maxCycle( Min(i,j), Max(i,j) ));
}
On Fri, 11 Apr 2008 10:41:55 +0200, (Pascal J. Bourguignon):
Ce qui donne, en 32-bit: echo 1 10000000|./syracuse-c Arithemtic overflow on 113383 Arf, effectivement, je n'y avais même pas pensé.
Par contre, je ne comprends pas pourquoi le programme plante. n*3+1 devrait donner une valeur (éventuellement fausse au sens arithmétique) pour tout n, sans plantage, non ? Non, les débordement peuvent produire n'importe quel résultat, comme
le déclanchement de la quatrième guerre mondiale, ou la sortie de démons nasaux. En clair, chaque compilateur fait ce qu'il veut.
J'étais étonné de la différence pour le même oss, le même code, et un compilo différent.
Ce qui m'embête toujours un peu , c'est qu'en utilisant le code vérifiant la dépassement (un remplaçant exit(1) par exit(0)), je devrais juste avoir une "mauvaise réponse", mais j'obtiens toujours une erreur.
Alors là, je ne sais pas. Essaye d'exécuter le programme sous gdb et voir où exactement se situe l'erreur.
WARNING: This product attracts every other piece of matter in the universe, including the products of other manufacturers, with a force proportional to the product of the masses and inversely proportional to the distance between them.
David Fleury <dfleury2@libertysurf.fr> writes:
Fabien LE LEZ <gramster@gramster.com> writes:
On Fri, 11 Apr 2008 10:41:55 +0200, pjb@informatimago.com (Pascal J.
Bourguignon):
Ce qui donne, en 32-bit:
echo 1 10000000|./syracuse-c
Arithemtic overflow on 113383
Arf, effectivement, je n'y avais même pas pensé.
Par contre, je ne comprends pas pourquoi le programme plante. n*3+1
devrait donner une valeur (éventuellement fausse au sens arithmétique)
pour tout n, sans plantage, non ?
Non, les débordement peuvent produire n'importe quel résultat, comme
le déclanchement de la quatrième guerre mondiale, ou la sortie de
démons nasaux. En clair, chaque compilateur fait ce qu'il veut.
J'étais étonné de la différence pour le même oss, le même code,
et un compilo différent.
Ce qui m'embête toujours un peu , c'est qu'en utilisant le code
vérifiant la dépassement (un remplaçant exit(1) par exit(0)), je
devrais
juste avoir une "mauvaise réponse", mais j'obtiens toujours une erreur.
Alors là, je ne sais pas. Essaye d'exécuter le programme sous gdb et
voir où exactement se situe l'erreur.
WARNING: This product attracts every other piece of matter in the
universe, including the products of other manufacturers, with a
force proportional to the product of the masses and inversely
proportional to the distance between them.
On Fri, 11 Apr 2008 10:41:55 +0200, (Pascal J. Bourguignon):
Ce qui donne, en 32-bit: echo 1 10000000|./syracuse-c Arithemtic overflow on 113383 Arf, effectivement, je n'y avais même pas pensé.
Par contre, je ne comprends pas pourquoi le programme plante. n*3+1 devrait donner une valeur (éventuellement fausse au sens arithmétique) pour tout n, sans plantage, non ? Non, les débordement peuvent produire n'importe quel résultat, comme
le déclanchement de la quatrième guerre mondiale, ou la sortie de démons nasaux. En clair, chaque compilateur fait ce qu'il veut.
J'étais étonné de la différence pour le même oss, le même code, et un compilo différent.
Ce qui m'embête toujours un peu , c'est qu'en utilisant le code vérifiant la dépassement (un remplaçant exit(1) par exit(0)), je devrais juste avoir une "mauvaise réponse", mais j'obtiens toujours une erreur.
Alors là, je ne sais pas. Essaye d'exécuter le programme sous gdb et voir où exactement se situe l'erreur.
WARNING: This product attracts every other piece of matter in the universe, including the products of other manufacturers, with a force proportional to the product of the masses and inversely proportional to the distance between them.