Un défi par semaine

Juillet 2015, 5e défi

Le 31 juillet 2015  - Ecrit par  Ana Rechtman Voir les commentaires (8)
Lire l'article en  

Nous vous proposons un défi du calendrier mathématique 2015 chaque vendredi et sa solution la semaine suivante.

Semaine 31 :

On considère un nombre à deux chiffres et on multiplie les deux chiffres. Si le résultat est un nombre à un chiffre, on l’appelle l’« image » du nombre de départ. Si le résultat est un nombre à deux chiffres, on répète l’opération jusqu’à obtenir un nombre à un chiffre qui sera son « image ». Combien de nombres à deux chiffres ont pour « image » $8$ ?

Solution du 4ème défi de Juillet :

Enoncé

La somme des neuf nombres est $1+2+\cdots+9=45$. Appelons les nombres dans le tableau comme dans la figure ci-dessous. Alors la moyenne des nombres dans chaque ligne et colonne doit être égale à $i$.

PNG - 13.8 ko

Comme les colonnes ont la même moyenne on a

$a+b+c=d+e+f=\frac{3}{2}(g+h)=3i.$

On a alors

$i = 45-(a+b+c+d+e+f+g+h)$

$ = 45-(3i+3i+2i)$

$ = 45-8i,$

d’où $i=5$. Il nous faut donc deux triplets de nombres $(a,b,c)$ et $(d,e,f)$ disjoints et tels que, pour chaque triplet, la somme de ses éléments soit égale à $3i=15$. Donc $(a,b,c)$ et $(d,e,f)$ sont égaux à $(9,4,2)$ et $(8,6,1)$ dans un certain ordre. Avec ceci nous pouvons remplir le tableau :

PNG - 14.2 ko

Cette solution n’est pas unique.

Post-scriptum :

Calendrier mathématique 2015 - Sous la direction d’Ana Rechtman Bulajich, Anne Alberro Semerena, Radmilla Bulajich Manfrino - Textes : Ian Stewart.
2014, Presses universitaires de Strasbourg. Tous droits réservés.

Article édité par Ana Rechtman

Partager cet article

Pour citer cet article :

Ana Rechtman — «Juillet 2015, 5e défi» — Images des Mathématiques, CNRS, 2015

Crédits image :

Image à la une - Ievgen Sosnytskyi / SHUTTERSTOCK

Commentaire sur l'article

Voir tous les messages - Retourner à l'article

  • Juillet 2015, 5ème défi

    le 2 août 2015 à 13:59, par Lhooq

    J’ai une solution d’informaticien (faite en OCaml, désolé pour ceux qui n’en connaissent pas la syntaxe ou ne comprennent rien à l’informatique) (Pour la validation du commentaire, je me suis permis de chercher quels sont les possibilités html pour intégrer du code mais je n’ai pas réussi à mettre de la coloration syntaxique, vous excuserez cette liberté. Soit dit en passant, serait-il possible d’avoir plus d’options d’édition de texte ? ;-)) :

    Code

    (* L'ensemble qui nous permettra de savoir si on a déjà vu
         l'entier à étudier *)
    module S = Set.Make (
     struct
       type t = int
       let compare = compare
     end
    )

    (* On se permet une fantaisie dans le sens où on peut choisir
       qu'on veut tous les nombres à 3 chiffres etc. *)
    let sup = int_of_string Sys.argv.(2)
    let inf = sup / 10

    (* Simple fonction permettant de trouver tous les couples de diviseurs *)
    let find_divs n =
     let lim = int_of_float (sqrt (float_of_int n)) in
     let rec fd d acc =
       if d > lim then acc
       else
         let acc =
            if n mod d = 0 then
              (d,n/d)::acc
            else acc
         in fd (d+1) acc
     in fd 1 []

    (* Fonction principale *)
    let search n =
     (* Oui, on déclare une fonction dans une fonction, pour les non-connaisseurs
           c'est une des grandes forces d'OCaml *)
     let rec s i vus =
       (* Si i a plus de chiffres que voulu ou
             si i a déjà été vu, on ne fait rien *)
       if (i >= sup || S.mem i vus) then (0, vus)
       (* Sinon, on commence le traitement *)
       else
         (* On enregistre le fait qu'on a maintenant vu i *)
         let vus = S.add i vus in
         (* On récupère l'ensemble des diviseurs de i *)
         let l = find_divs i in
         (* Si i a le bon nombre de chiffres on le compte *)
         let r = if i >= inf then 1 else 0 in
         List.fold_left (
           fun (res, set') (d1, d2) ->
             (* Pour chaque couple on crée les deux nombres résultants
                   (par exemple, pour 2 et 4, 24 et 42 *)
             let i1 = int_of_string ((string_of_int d1)^(string_of_int d2)) in
             let i2 = int_of_string ((string_of_int d2)^(string_of_int d1)) in
             (* On rappelle récursivement la fonction sur ces deux nombres
                   et on somme les résultats renvoyés au résultat total *)
             let r1, set' = s i1 set' in
             let r2, set' = s i2 set' in
             (r1 + r2 + res, set')
         ) (r, vus) l
     in s n S.empty
     
    (* On appelle ici la fonction sur le nombre de notre choix *)
    let () =
     let n = int_of_string Sys.argv.(1) in
     let (res, _) = search n in
     Format.printf "%d -> %d@." n res

    Résultats

    1 -> 1
    2 -> 8
    3 -> 2
    4 -> 9
    5 -> 6
    6 -> 13
    7 -> 2
    8 -> 22
    9 -> 3

    (On comprend donc le choix de 8)

    Pour les sceptiques ou les curieux, je vous invite à copier le code ci-dessous que j’ai rendu exécutable pour le site http://try.ocamlpro.com/ sur lequel je vous invite à copier le code dans le cadre noir.

    Un appui sur Entrée puis vous pouvez vous amuser à écrire (sans le #, évidemment)

    # main 8 100

    Un nouvel appui sur Entrée vous donnera le résultat (8, 22) et vous pouvez vous amuser avec d’autres nombres. (Soit dit en passant, pour rebondir sur cet article, le code sera interprété sans être compilé mais reste du haut niveau :-))

    Code exécutable

    (* L'ensemble qui nous permettra de savoir si on a déjà vu
         l'entier à étudier *)
    module S = Set.Make (
     struct
       type t = int
       let compare = compare
     end
    )

    (* Simple fonction permettant de trouver tous les couples de diviseurs *)
    let find_divs n =
     let lim = int_of_float (sqrt (float_of_int n)) in
     let rec fd d acc =
       if d > lim then acc
       else
         let acc =
       if n mod d = 0 then
         (d,n/d)::acc
       else acc
         in fd (d+1) acc
     in fd 1 []

    (* Fonction principale *)
    let search n sup =
     let inf = sup/10 in
     (* Oui, on déclare une fonction dans une fonction, pour les non-connaisseurs
           c'est une des grandes forces d'OCaml *)
     let rec s i vus =
       (* Si i a plus de chiffres que voulu ou
             si i a déjà été vu, on ne fait rien *)
       if (i >= sup || S.mem i vus) then (0, vus)
       (* Sinon, on commence le traitement *)
       else
         (* On enregistre le fait qu'on a maintenant vu i *)
         let vus = S.add i vus in
         (* On récupère l'ensemble des diviseurs de i *)
         let l = find_divs i in
         (* Si i a le bon nombre de chiffres on le compte *)
         let r = if i >= inf then 1 else 0 in
         List.fold_left (
           fun (res, set') (d1, d2) ->
             (* Pour chaque couple on crée les deux nombres résultants
                   (par exemple, pour 2 et 4, 24 et 42 *)
             let i1 = int_of_string ((string_of_int d1)^(string_of_int d2)) in
             let i2 = int_of_string ((string_of_int d2)^(string_of_int d1)) in
             (* On rappelle récursivement la fonction sur ces deux nombres
                   et on somme les résultats renvoyés au résultat total *)
             let r1, set' = s i1 set' in
             let r2, set' = s i2 set' in
             (r1 + r2 + res, set')
         ) (r, vus) l
     in s n S.empty

    (* On appelle ici la fonction sur le nombre de notre choix *)
    let main n sup =
     let (res, _) = search n sup in
     (n, res)
    Répondre à ce message

Laisser un commentaire

Forum sur abonnement

Pour participer à ce forum, vous devez vous enregistrer au préalable. Merci d’indiquer ci-dessous l’identifiant personnel qui vous a été fourni. Si vous n’êtes pas enregistré, vous devez vous inscrire.

Connexions’inscriremot de passe oublié ?