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

Algorithmes et structures de données Discussion :

Problème de méthode


Sujet :

Algorithmes et structures de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Novembre 2007
    Messages
    30
    Détails du profil
    Informations forums :
    Inscription : Novembre 2007
    Messages : 30
    Par défaut Problème de méthode
    Bonsoir à tous j'ai un projet à faire en langage C, je bloque sur l'énoncé depuis longtemps et je n'arrive pas du tt à comprendre comme résoudre ce programme:

    On cherche à énumérer des triplets d'entiers (x,y,z) répondant à l'égalité suivante: x² + y² = z²
    avec x<=y et z<=1000
    Ce programme doit être le plus rapide possible.

    Pouvez vous m'éclaircir davantage sur la méthode svp?
    Doit on faire appelle à un tableau?
    Merci

  2. #2
    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 Fredo123456 Voir le message
    Bonsoir à tous j'ai un projet à faire en langage C, je bloque sur l'énoncé depuis longtemps et je n'arrive pas du tt à comprendre comme résoudre ce programme:

    On cherche à énumérer des triplets d'entiers (x,y,z) répondant à l'égalité suivante: x² + y² = z²
    avec x<=y et z<=1000
    Ce programme doit être le plus rapide possible.

    Pouvez vous m'éclaircir davantage sur la méthode svp?
    Doit on faire appelle à un tableau?
    Merci
    Ben non, pas besoin de tableau. Une boucle sur "z" de 0 à 1000; une boucle sur "x" de 0 à z, une boucle sur "y" de 0 à x
    On regarde si x² + y² = z² si oui on affiche
    Si non et si x² + y² > z² on interromp la boucle "y" et l'algo est terminé.
    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]

  3. #3
    Rukia
    Invité(e)
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben non, pas besoin de tableau. Une boucle sur "z" de 0 à 1000; une boucle sur "x" de 0 à z, une boucle sur "y" de 0 à x
    On regarde si x² + y² = z² si oui on affiche
    Si non et si x² + y² > z² on interromp la boucle "y" et l'algo est terminé.
    et comment verifier tu que x<=y ???
    j'ai pas compris cette ligne si x² + y² > z² on interromp la boucle "y"

  4. #4
    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 Rukia-chan Voir le message
    et comment verifier tu que x<=y ???
    Ben parce que y part de x !!!

    Citation Envoyé par Rukia-chan Voir le message
    j'ai pas compris cette ligne si x² + y² > z² on interromp la boucle "y"
    La boucle "y" est la 3° (la plus imbriquée). Si x² + y² > z² on la breake et on retourne donc sur la boucle "x"

    Citation Envoyé par fremen167 Voir le message
    Tu peux éviter les 0, non ?
    Oui évidemment...

    Citation Envoyé par Rukia-chan Voir le message
    Tu peux aussi améliorer en supprimant la 3ème boucle :
    si z et x sont déterminés, il suffit de vérifier que z2 - x2 est un carré et est inférieur à x2.
    Effectivement on peut supprimer la boucle "y" mais ca implique alors de calculer la racine carrée de z² - x² et de vérifier si cette racine est entière. Ce calcul peut être "un peu" long et ne pas correspondre aux contraintes "algorithme très rapide".
    Ou alors on stocke toutes les nombres entre 1 et 1000000 dont les racines sont entières dans un tableau et on regarde si z² - x² est égal à un nombre de ce tableau...

    Citation Envoyé par siegfried64 Voir le message
    cette méthode marche mais c'est loin d'etre rapide, tu a en face de toi une boucle qui va etre repeté 1000000 fois pour faire les tests, 1 Million de tests.
    comme la il s'agit d'une cas particuliere du fameux theoreme de Fermat, tu dois fouiller un peu dans tes cours pour chercher la solution de ce system.
    les triplets qui sont une solution de cette equation verifient :

    m<n , m et n sont premier entre eux.
    x=2*m*n
    y=n²-m²
    z=n²+m²

    comme z<1000, on en deuit que n<90, donc on fait deux boucle, une sur n, et a l interieur de cette boucle une autre sur m, et voila, au lieu de 1 millions de comparaison et tout on a fait juste 1000
    Joli. Si les formules sont exactes ça évite un paquet de boucles. Comme quoi, contrairement aux affirmations de certains cancres, les maths c'est utile...
    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]

  5. #5
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par Sve@r Voir le message

    Ce calcul peut être "un peu" long et ne pas correspondre aux contraintes "algorithme très rapide".
    Ou alors on stocke toutes les nombres entre 1 et 1000000 dont les racines sont entières dans un tableau et on regarde si z² - x² est égal à un nombre de ce tableau...
    Je serai très surpris que le calcul de racine carré soit plus long que ta troisième boucle... et avec l'autre optimisation que j'ai proposé (racine(2)), ça doit être très rapide... mais beaucoup moins que la méthode mathématique. J'avais trouvé cette méthode (par "triplets de Pythagore"), mais je ne suis pas sûr qu'on génère tous les triplets de cette manière.

  6. #6
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Joli. Si les formules sont exactes ça évite un paquet de boucles. Comme quoi, contrairement aux affirmations de certains cancres, les maths c'est utile...
    Oui, les formules sont exactes. Il suffit de prendre un complexe (a+ib) quelconque et de l'elever au carré pour trouver les formules.

    A noter que si m,n sont premiers entre eux alors on n'obtient que les triplets primitifs. Donc pour une liste exhaustive, il faut prendre tous les m,n.
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 5
    Par défaut
    Ayant un programme légèrement similaire a celui ci, je me permet de poster ici pour éviter de faire un nouveau post.
    Je dois aussi utiliser dans un programme l'égalité de Fermat tel que x^2+y^2=z^2.
    J'ai compris ce qui a été dit précédement sur ce qu'à dit "siegfried64", mais étant particulièrement mauvais en C, je voulais savoir de qu'elle boucle tu parleS, une boucle FOR ? Je commence a peine la prog, je voudrais juste savoir quelle boucle il faut utiliser, je me débrouillerais pour le faire marcher ...
    Merci d'avance !

  8. #8
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Ben non, pas besoin de tableau. Une boucle sur "z" de 0 à 1000; une boucle sur "x" de 0 à z, une boucle sur "y" de 0 à x
    On regarde si x² + y² = z² si oui on affiche
    Si non et si x² + y² > z² on interromp la boucle "y" et l'algo est terminé.
    Tu peux éviter les 0, non ?

    Tu peux aussi améliorer en supprimant la 3ème boucle :
    si z et x sont déterminés, il suffit de vérifier que z2 - x2 est un carré et est inférieur à x2.

  9. #9
    Membre chevronné
    Profil pro
    Inscrit en
    Octobre 2007
    Messages
    362
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 362
    Par défaut
    Et pour être sûr que y sera inférieur à x, tu peux faire partir ta deuxième boucle de z / (racine de 2) car si x < à cette valeur,
    x2 < z2 / 2 ==> y2 > z2 /2.

  10. #10
    Membre éprouvé Avatar de siegfried64
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    78
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : Maroc

    Informations forums :
    Inscription : Novembre 2007
    Messages : 78
    Par défaut
    cette méthode marche mais c'est loin d'etre rapide, tu a en face de toi une boucle qui va etre repeté 1000000 fois pour faire les tests, 1 Million de tests.
    comme la il s'agit d'une cas particuliere du fameux theoreme de Fermat, tu dois fouiller un peu dans tes cours pour chercher la solution de ce system.
    les triplets qui sont une solution de cette equation verifient :

    m<n , m et n sont premier entre eux.
    x=2*m*n
    y=n²-m²
    z=n²+m²

    comme z<1000, on en deuit que n<90, donc on fait deux boucle, une sur n, et a l interieur de cette boucle une autre sur m, et voila, au lieu de 1 millions de comparaison et tout on a fait juste 1000

Discussions similaires

  1. Problème avec méthode "cloneNode()"
    Par kingmandrax dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/10/2006, 14h14
  2. Problème de méthode
    Par Thibaut_Dupont dans le forum Requêtes et SQL.
    Réponses: 9
    Dernier message: 10/07/2006, 14h16
  3. problème de méthode paint()
    Par guillaumeM63 dans le forum 2D
    Réponses: 2
    Dernier message: 16/05/2006, 23h50
  4. problème bizarre, méthode recurssive
    Par akrobat dans le forum C++
    Réponses: 19
    Dernier message: 05/05/2006, 14h22
  5. Problème de méthode
    Par Clad3 dans le forum C++
    Réponses: 2
    Dernier message: 10/09/2005, 11h08

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