Petite incompréhension -> résultat différent selon le type
Bonjour,
Déjà je viens à peine de découvrir F# (et les langages fonctionnels par la même occasion), donc j'y vais lentement, j'essaie de bien tout comprendre (c'est pas gagné :aie:) et pour cela je me sers du Project Euler pour me faire la main.
En fait j'ai un souci concernant ce problème là:
Citation:
2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
j'ai tout d'abord écrit ce code là (après maints essais :aie:)
Code:
1 2 3 4 5
|
let Euler005 =
let rec pgcd x y = if y = 0 then x else pgcd y ( x % y )
let ppcm x y = x * y / ( pgcd x y )
{ 1 .. 20 } |> Seq.fold ppcm 1 |
Qui m'a affiché comme résultat 18 044 195 qui ne se trouve pas être la bonne réponse.
Après m'être relu, avoir griffonné sur papier, et ne pas m'être rendu compte d'une erreur flagrante, j'ai bidouillé ça un peu dans tout les sens pour arriver à force de changements (et d'annulation de changements) à ceci
Code:
1 2 3 4 5
|
let Euler005 =
let rec pgcd x y = if y = 0L then x else pgcd y ( x % y )
let ppcm x y = x * y / ( pgcd x y )
{ 1L .. 20L } |> Seq.fold ppcm 1L |
Notez que la seule différence est le typage passé de int à int64 et là je lance et pof 232 792 560 le bon résultat
Alors je fais un bon :yeah: mais au final je pige pas pourquoi ça donne le bon résultat avec des int64 et pas avec des int vu que je suis à peine à 10% de la valeur maximale pour un int :koi:
Donc si quelqu'un peut m'éclairer là dessus (ou sur mon algo, un conseil est toujours bon à prendre ;)) je le remercie d'avance.
Cordialement !