Question

Je résous le problème 9 sur le Project Euler . Dans ma solution, j'utilise un & Quot; goto & Quot; déclaration à sortir de deux pour les boucles. Le problème est le suivant:

  

Un triplet de Pythagore est un ensemble de trois nombres naturels, un b b c, pour lequel,

     

a ^ 2 + b ^ 2 = c ^ 2

     

Par exemple, 3 ^ 2 + 4 ^ 2 = 9 + 16 = 25 = 52.

     

Il existe exactement un triplet de Pythagore pour lequel a + b + c = 1000.   Trouvez le produit abc.

Ma solution est en c ++:

int a,b,c;
const int sum = 1000;
int result = -1;
for (a = 1; a<sum; a++){
    for (b = 1; b < sum; b++){
            c = sum-a-b;
            if (a*a+b*b == c*c){
                result = a*b*c;
                goto found;
            }
    }   
}
found:
std::cout << "a:" << a << std::endl;
std::cout << "b:" << b << std::endl;
std::cout << "c:" << c << std::endl;
std::cout <<"Result:" << result << std::endl;

Depuis " goto " Je voudrais savoir si les instructions ne sont pas très populaires parmi les programmeurs c ++, si cela peut être considéré comme une utilisation raisonnable de & "; goto &"; Ou s'il existe une meilleure solution au problème qui n'a pas besoin de & "Goto &"; Je ne veux pas dire par là une solution qui évite simplement & "Goto &", Mais qui évite & "Goto &"; d'une manière qui améliore l'algorithme.

Était-ce utile?

La solution

return est un " structuré " goto que beaucoup de programmeurs trouvent plus acceptable! Donc:

static int findit(int sum, int* pa, int* pb, int* pc)
{
    for (int a = 1; a<sum; a++) {
        for (int b = 1; b < sum; b++) {
            int c = sum-a-b;
            if (a*a+b*b == c*c) {
                *pa = a; *pb = b; *pc = c;
                return a*b*c;
        }
    }
    return -1;    
}

int main() {
    int a, b, c;
    const int sum = 1000;
    int result = findit(sum, &a, &b, &c);
    if (result == -1) {
        std::cout << "No result!" << std::endl;
        return 1;
    }
    std::cout << "a:" << a << std::endl;
    std::cout << "b:" << b << std::endl;
    std::cout << "c:" << c << std::endl;
    std::cout <<"Result:" << result << std::endl;
    return 0;
}

Autres conseils

À mon avis, il est correct d'utiliser goto dans une situation comme celle-ci.

Btw, la prédication condescendante contre la goto vient généralement de gens qui ne font que répéter ce qu'ils ont entendu dire ou lire quelque part ..

Voir cette question sur la rupture de 2 boucles. Il y a de bien meilleures réponses fournies que d'utiliser un goto.

La meilleure solution consiste à placer votre deuxième boucle dans une fonction et à l'appeler de l'intérieur de votre première boucle.

code copié à partir de la réponse de mquander

public bool CheckWhatever(int whateverIndex)
{
    for(int j = 0; j < height; j++)
    {
        if(whatever[whateverIndex][j]) return false;
    }

    return true;
}

public void DoubleLoop()
{
    for(int i = 0; i < width; i++)
    {
        if(!CheckWhatever(i)) break;
    }
}

Bien que j’ai le sentiment qu’utiliser un goto dans ce cas n’est pas aussi grave que de tuer des chatons. Mais c'est proche.

Je ne peux pas penser à une meilleure alternative. Mais une alternative n’utilisant pas goto serait de modifier la première for - boucle:

for (a = 1; a<sum && result == -1; a++){

Puis break sur la deuxième -1 - boucle. Cela fonctionnera en supposant que le résultat ne sera jamais <=> après la deuxième <=> - la boucle a été interrompue par <=>.

Vous pouvez déclarer un bool found = false en haut, puis ajouter && !found à vos conditions de boucle for (après a < sum et b < sum), puis définir found à true, à l'endroit où se trouve actuellement votre goto. Ensuite, associez votre sortie à la condition que true soit trouvé.

Je viens de trouver cela sur le "é " barre latérale. Un sujet intéressant dans l’ensemble, mais en particulier, this est une réponse à ma question.

int a,b,c,sum = 1000;
for (a = 1; a<sum; ++a)
 for (b = 1; b<sum; ++b){
  c = sum-a-b;
  if (a*a+b*b == c*c) sum = -a*b*c;
 }
printf("a: %d\n",a-1);
printf("b: %d\n",b-1);
printf("c: %d\n",c);
printf("Result: %d\n",-sum);

Résultat également optimisé ..: P

Quoi qu'il en soit, j'adore les gotos!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top