Un défi par semaine

Décembre 2017, 4e défi

El 22 diciembre 2017  - Escrito por  Ana Rechtman Ver los comentarios (12)
Leer el artículo en  

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

Semaine 51 :

Un entier positif est sympathique s’il est multiple du produit de ses chiffres.
Par exemple $312$ est un nombre sympathique puisque $312=52\times (3\times 1\times 2)$. Combien y a-t-il de nombres sympathiques à deux chiffres ?

Solution du 3e défi de Décembre :

Enoncé

La réponse est en deuxième position.

L’énoncé dit que Sophie a nagé plus vite que Marie, que Marie a été plus rapide que Paule et Paule plus rapide que Laura, et enfin que Laura est arrivée avant Anne. Le classement final est donc : Sophie, Marie, Paule, Laura et Anne, donc Marie est arrivée en deuxième position.

Post-scriptum :

Calendrier mathématique 2017 - Sous la direction d’Ana Rechtman, Maxime Bourrigan - Textes : Antoine Rousseau et Marcela Szopos.
2016, Presses universitaires de Strasbourg. Tous droits réservés.

Article édité par Ana Rechtman

Comparte este artículo

Para citar este artículo:

Ana Rechtman — «Décembre 2017, 4e défi» — Images des Mathématiques, CNRS, 2017

Créditos de las imágenes:

Imagen de portada - MAURITUS IMAGES / IMAGEBROKER / J.W. ALKER / PHOTONONSTOP

Comentario sobre el artículo

Voir tous les messages - Retourner à l'article

  • Décembre 2017, 4e défi

    le 23 de diciembre de 2017 à 22:55, par Jean-Paul

    J’ai aussi fait le test en C++ , d’abord en utilisant la méthode directe; puis avec une approche récursive, beaucoup plus rapide. Les temps obtenus pour 7, 8 et 9 chiffres:

    Méthode directe: .23, 2.3 et 23.4
    Méthode récursive: .07, .55 et 4.8

    Dans la méthode récursive, il y a un niveau d’appel pour chaque chiffre et le calcul du produit des premiers chiffres est passé au niveau suivant, ce qui réduit de beaucoup le nombre de calculs.

     
    #include    <iostream>
    using namespace std;

    void f(long long, long, int);

    int main(int ac, char *av[])
    {
       int nch = atoi(av[1]);
       
       for (int i = 1; i <= nch; i++) f(0, 1, i);
       
       return 0;
    }  

    void f(long long n, long p, int niveau)
    {
       n *= 10;
       
       if (niveau == 1)
       {
           for (int i = 1; i <= 9; i++) if ((n+i) % (p*i) == 0) cout << n + i << endl;
       }
       else
       {  
           for (int i = 1; i <= 9; i++) f(n + i, p * i, niveau - 1);
       }  
    }


    Pour référence, la méthode directe:

     
    #include    <iostream>

    using namespace std;

    bool sym(long n);

    int main(int ac, char *av[])
    {
       long min = atoi(av[1]);
       long max = atoi(av[2]);
       
       for (long n = min; n < max; n++) if (sym(n)) cout << n << endl;
       
       return 0;
    }

    bool sym(long n)
    {  
       long c = n;
       long p = 1;
       
       do  
       {
           p *= c % 10;
           c /= 10;
       } while (c && p);
       
       return p && (n % p == 0);
    }
    Répondre à ce message

Dejar un comentario

Foro sólo para inscritos

Para participar en este foro, debe registrarte previamente. Gracias por indicar a continuación el identificador personal que se le ha suministrado. Si no está inscrito/a, debe inscribirse.

Conexióninscribirse¿contraseña olvidada?

La traducción del sitio del francés al castellano se realiza gracias al apoyo de diversas instituciones de matemáticas de América Latina.