IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Somme suite des n carrés


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Lycéen
    Inscrit en
    Mars 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 38
    Par défaut Somme suite des n carrés
    Bonjour,

    J'ai un exercice dont voici l'énoncé :

    Votre programme doit d'abord lire un entier, le nombre maximum de pierres dont pourra être composée la pyramide. Il devra ensuite calculer la hauteur de la plus grande pyramide qui pourra être construite, ainsi que le nombre de pierres qui sera nécessaire.

    EXEMPLE 1

    entrée :
    20
    sortie :
    3
    14
    EXEMPLE 2

    entrée :
    26042
    sortie :
    42
    25585
    Exemple d'une pyramide :

    Nom : schema.png
Affichages : 4347
Taille : 20,6 Ko
    On remarque tout de suite qu'il s'agit de la somme d'une suite des n termes au carré : 1, 4, 9, 16, 25 etc..

    Ce que j'ai fait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    result = 0
    i = 1
    maxPierres = int(input())
     
    while result < maxPierres:
        result = (i*i) + result
        i = i + 1
    print i
    print result
    Quand je rentre 20, j'obtiens bien le résultat escompté, mais quand je rentre 26042, non. J'ai donc fait un autre programme qui utilise la suite de la somme des n premiers nombres au carré n(n+1)(2*n+1)/6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    result = 0
    n = 1
    maxPierres = int(input())
    while result < max:
       result = ((n(n+1)(2*n+1))/(6)) + result
       n = n + 1
    print (n)
    print (result)
    mais j'obtiens l'erreur suivante :

    Traceback (most recent call last):
    File "<stdin>", line 5, in <module>
    TypeError: 'int' object is not callable
    Merci de votre aide.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Bonjour,

    Pour ta deuxième version le bug provient de ceci:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = ((n(n+1)(2*n+1))/(6)) + result
    En effet python ne comprend pas la notation n(n+1), il faut que tu laisse apparaitre les opérations:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    result = ((n*(n+1)*(2*n+1))/(6)) + result
    Mais j'ai du mal à comprendre l'origine de cette fonction.



    Pour moi ton premier code par contre ne fonctionne pas, même avec 20 en entré. La raison est simple, je m'explique: tu essaye de savoir le nombre d'étage de pierre on peut faire avec 20 pierres disposés en pyramide. Tu fais donc:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    result = 0
    i = 1
    maxPierres = int(input())
     
    while result < maxPierres:
        result = (i*i) + result
        i = i + 1
     
    print i
    print result
    Le truc c'est que ton "while" va fonctionner jusqu'à ce que result soit supérieur à maxPierre. Or result représente le nombre de pierres que tu as placé donc lorsque tu aura result > maxPierre la boucle s'arrêtera mais tu aura dépassé le nombre max de pierre autorisés!

    Mais bon...tu as moyen de te débrouiller =), une foi la boucle terminé il te suffit de revenir une étape avant!

  3. #3
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Viand0x Voir le message
    Mais j'ai du mal à comprendre l'origine de cette fonction.
    Bonjour
    Cette formule n'est pas évidente à trouver => http://www.les-suites.fr/somme-des-n...ers-carres.htm

    Citation Envoyé par Viand0x Voir le message
    Mais bon...tu as moyen de te débrouiller =), une foi la boucle terminé il te suffit de revenir une étape avant!
    Ou simplement afficher (i-1) (et faut aussi remplacer l'inégalité stricte < par une inégalité large <=...)

    Citation Envoyé par Grye300 Voir le message
    J'ai donc fait un autre programme qui utilise la suite de la somme des n premiers nombres au carré n(n+1)(2*n+1)/6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    result = 0
    n = 1
    maxPierres = int(input())
    while result < max:
       result = ((n(n+1)(2*n+1))/(6)) + result
       n = n + 1
    print (n)
    print (result)
    Hum, la formule f(n)=n(n+1)(2n+1)/6 ne doit être appliquée qu'une fois. Elle sert justement à ne pas avoir à sommer chaque élément de 1 à n mais de donner la somme d'un coup.
    Par exemple la somme des 5 premiers carrés est f(5)=5*6*11/6=55. Ce n'est certainement pas f(1)+f(2)+f(3)+f(4)+f(5) (qui donnerait 1+5+14+30+55 soit 105...)
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Bonjour
    Cette formule n'est pas évidente à trouver => http://www.les-suites.fr/somme-des-n...ers-carres.htm
    Oula oui maintenant que tu le dis je m'en souvient mais la boucle ne m'y aurait jamais fait pensé... ^^'

    Ou simplement afficher (i-1) (et faut aussi remplacer l'inégalité stricte < par une inégalité large <=...)
    Je crois même qu'il s'agit de i-2. Sinon je disais qu'il fallait revenir une étape en avant car l'exercice demande combien de pierre sont finalement utilisées, il faut donc print resultat (mais avant qu'il dépasse maxPierre).

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 835
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Viand0x Voir le message
    Je crois même qu'il s'agit de i-2.
    Non, c'est i-1 si on utilise une inégalité large. Car lorsqu'on sort de la boucle, i vient juste de dépasser le niveau max.

    Citation Envoyé par Viand0x Voir le message
    Sinon je disais qu'il fallait revenir une étape en avant car l'exercice demande combien de pierre sont finalement utilisées, il faut donc print resultat (mais avant qu'il dépasse maxPierre).
    Ou alors afficher i (i-1) (2i-1)/6 (c'est la même formule mais appliquée à i-1)...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  6. #6
    Membre averti
    Femme Profil pro
    Lycéen
    Inscrit en
    Mars 2012
    Messages
    38
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : Lycéen
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 38
    Par défaut
    Salut,

    Pour moi ton premier code par contre ne fonctionne pas, même avec 20 en entré. La raison est simple, je m'explique: tu essaye de savoir le nombre d'étage de pierre on peut faire avec 20 pierres disposés en pyramide.
    Je me suis trompé quand j'ai copié mon code... Voici celui qui fonctionne quand on entre 20, mais quand on entre 26042, non (22, 3795) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i = 1
    result = 0
    maxCubes = int(input())
    while maxCubes > result:
        result = (i*i) + result
        maxCubes = maxCubes - result
        i = i + 1
    print (i - 1)
    print (result)
    Le truc c'est que ton "while" va fonctionner jusqu'à ce que result soit supérieur à maxPierre. Or result représente le nombre de pierres que tu as placé donc lorsque tu aura result > maxPierre la boucle s'arrêtera mais tu aura dépassé le nombre max de pierre autorisés!
    Effectivement, je me suis pris pas mal la tête avec ça..

    J'ai donc fait un autre code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    i = 1
    result = 0
    maxCubes = int(input())
    while maxCubes >= result:
        result = (i*i) + result
        maxCubes = maxCubes - result
        i = i + 1
    print (i - 1)
    print (result + maxCubes)
    Même chose afficher bien ce qu'on lui demande quand on entre 20 mais pas 26042 (22, 6561)


    Hum, la formule f(n)=n(n+1)(2n+1)/6 ne doit être appliquée qu'une fois. Elle sert justement à ne pas avoir à sommer chaque élément de 1 à n mais de donner la somme d'un coup.
    Par exemple la somme des 5 premiers carrés est f(5)=5*6*11/6=55. Ce n'est certainement pas f(1)+f(2)+f(3)+f(4)+f(5) (qui donnerait 1+5+14+30+55 soit 105...)
    Exact, je vais essayer de corriger mon code.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Juin 2013
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2013
    Messages : 43
    Par défaut
    Non, c'est i-1 si on utilise une inégalité large. Car lorsqu'on sort de la boucle, i vient juste de dépasser le niveau max.
    Hum, comment expliquer ça... Il suffit de tester avec 5 pierres, i-1 retourne 3 et non 2.

    C'est logique vu que i est toujours en avance d'un sur le nombre de niveau actuel (i est initialisé à 1 pendant que resultat est à 0). Donc en plus de devoir retrancher 1 de i du fait de l'incrémentation de i dans la boucle, il faut retirer à nouveau 1 à i pour obtenir le véritable niveau actuel...

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/06/2007, 19h04
  2. Somme sur des arrondis
    Par GregPeck dans le forum Requêtes
    Réponses: 3
    Dernier message: 12/05/2006, 09h54
  3. ajouter à la suite des tableaux
    Par vic_cw dans le forum C++
    Réponses: 9
    Dernier message: 22/08/2004, 15h11
  4. Warnings intempestifs (tout de suite des grands mots)
    Par Walm dans le forum C++Builder
    Réponses: 4
    Dernier message: 30/04/2004, 20h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo