1
votes

Comment structurer plus d'une boucle for en une instruction if?

J'essaye de résoudre un problème avec un tableau de nombres et 3 boucles for en Java. Il s'agit de déterminer quels 3 nombres du tableau s'additionnent à une somme spécifique. Pour ce test, j'ai utilisé une somme de 9.

0 0 30 1 20 2 10 3 01 0 21 1 11 2 02 0 12 1 03 0 0

La bonne réponse est 3 3 3 mais cette sortie se lit comme suit:

int nums[] = {1, 3, 5, 7, 9, 11, 13, 15};

for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++)
        for (int y = 0; y <= 7; y++)

            if(nums[i] + nums[j] + nums[y] == 9)
                System.out.print(i + " " + j + " " + y);
}

Je sais Je suis probablement en train d'imbriquer complètement les boucles for, mais je ne peux pas savoir où placer les blocs de code sans me débarrasser de l'une des variables dans la portée de l'instruction if. Merci pour toute aide.


6 commentaires

Vous n'ajoutez pas d'espace à la fin donc les ensembles sont 0 0 3 (1 + 1 + 7), 0 1 2 (1 + 3 + 5), etc. Tous ajoutent jusqu'à 9, donc c'est la sortie correcte


La bonne réponse n'est certainement pas 3 3 3, donc si je ne me trompe pas, vous voulez trouver un triplet qui résume à votre somme de test, qui dans ce cas est 9, donc la réponse correcte est 1,3,5 < / code>


Et oui, pour commencer: utilisez println (), pour avoir des retours à la ligne entre vos différentes instructions d'impression. Aide à la lecture.


Faites en sorte que votre System.out.print utilise nums [i] , pas seulement i , etc.


Avez-vous l'intention d'imprimer l'index ou les chiffres réels? Vous imprimez des index: j plutôt que num [j] par exemple. Êtes-vous autorisé à répéter? Sinon, vous devez vous en occuper dans les boucles for.


Aussi: I, j, y? ;-) 'k' semble être un choix plus évident pour la variable de boucle la plus interne. Non pas que cela change la logique, mais un lecteur du code existant est enclin à penser "ok, pourquoi est-ce que 'y' est utilisé ici?".


3 Réponses :


0
votes

La bonne réponse est 3 3 3 mais cette sortie se lit comme suit:

Non, la bonne réponse n'est certainement pas 3 3 3 , donc si je ne me trompe pas, vous voulez trouver un triplet qui résume votre somme de test, qui dans ce cas est de 9, donc la bonne réponse est 1,3,5 Essayez ceci:

for (int i = 0; i <= 7; i++) {
  for (int j = i + 1; j <= 7; j++)
   for (int y = j + 1; y <= 7; y++)

      if (nums[i] + nums[j] + nums[y] == 9)
       System.out.print(nums[i] + " " + nums[j] + " " + nums[y]);
}

Exemple d'exécution: https://ideone.com / 5UAuGv


1 commentaires

Merci, cette réponse fonctionne également, et je n'ai pas compris ce que l'impression i j et y par eux-mêmes faisait au début et cela a beaucoup plus de sens



1
votes

Quelques problèmes dans votre code

  • Vous imprimez les index System.out.print (i + "" + j + "" + y); vous voulez plutôt imprimer les nombres.
  • Vous souhaitez utiliser println pour tout imprimer sur une nouvelle ligne
  • Il ne faut pas prendre un élément de la liste plusieurs fois, chaque boucle interne doit ignorer les éléments déjà pris en compte par la boucle externe
  • 3,3,3 n'est pas la réponse car il contient des éléments répétés, la réponse doit être celle qui contient des éléments distincts c'est-à-dire 1,3,5

Le code mis à jour sera alors

1 1 7                                                                                                                                                          
1 3 5                                                                                                                                                          
1 5 3                                                                                                                                                          
1 7 1                                                                                                                                                          
3 1 5                                                                                                                                                          
3 3 3                                                                                                                                                          
3 5 1                                                                                                                                                          
5 1 3                                                                                                                                                          
5 3 1                                                                                                                                                          
7 1 1 

Le résultat sera

for (int i = 0; i <= 7; i++) {
    for (int j = 0; j <= 7; j++)
        for (int y = 0; y <= 7; y++)

            if( nums[i] + nums[j] + nums[y] == 9)
                //Print the numbers on newline
                System.out.println(nums[i] + " " +nums[j] + " " + nums[y]);
}

Si la répétition est autorisé, alors les 3 boucles partiront de 0 et la réponse changera

1 3 5                                                                                                                                                            

La réponse sera alors

for (int i = 0; i <= 7; i++) {
    for (int j = i+1; j <= 7; j++)
        for (int y = j+1; y <= 7; y++)

            if( nums[i] + nums[j] + nums[y] == 9)
                //Print the numbers on newline
                System.out.println(nums[i] + " " +nums[j] + " " + nums[y]);
}


1 commentaires

Merci pour l'aide, j'aurais dû mentionner que j'avais l'intention de répéter les chiffres, mais je suppose que 1, 3, 5 était la réponse que je recherchais réellement, et cette première explication a fonctionné parfaitement!



0
votes

Vous testez les mêmes valeurs plusieurs fois, c'est-à-dire que 1 + 1 + 7, 1 + 7 + 1, 7 + 1 + 1 sont tous testés. Utilisez for for (int j = i; j <= 7; j ++) et for (int y = j; y <= 7; y ++) . Notez qu'il existe plusieurs réponses, pas seulement 3 3 3, si vous autorisez l'utilisation de valeurs plusieurs fois .


0 commentaires