Un défi par semaine

Décembre 2017, 4e défi

Le 22 décembre 2017  - Ecrit par  Ana Rechtman Voir les commentaires (12)

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

Partager cet article

Pour citer cet article :

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

Crédits image :

Image à la une - MAURITUS IMAGES / IMAGEBROKER / J.W. ALKER / PHOTONONSTOP

Commentaire sur l'article

Voir tous les messages - Retourner à l'article

  • Décembre 2017, 4e défi

    le 23 décembre 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

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é ?