Je construis un jeu de mathématiques pour Java et je suis bloqué à cette partie selon les détails de ma mission. Les règles sont simples: vous devez utiliser chaque numéro une seule fois et seuls les 4 numéros lus de l'utilisateur à trouver une équation pour obtenir 24.
Par exemple, pour les nombres 4,7,8,8, a La solution possible est la suivante: (7- (8/8)) * 4 = 24. P>
La plupart des ensembles de 4 chiffres peuvent être utilisés dans plusieurs équations résultant en 24. Par exemple, l'entrée 2,2,4 , 7 peut être utilisé de plusieurs façons d'obtenir 24: p>
2 + 2 * (4 + 7) = 24 p>
2 + 2 * (7 + 4) = 24 p>
(2 + 2) * 7-4 = 24 p>
(2 * 2) * 7-4 = 24 p>
2 * (2 * 7) -4 = 24 p>
Il existe également des combinaisons de 4 chiffres qui ne peuvent entraîner aucune équation égale avec 24. Par exemple, 1,1,1,1. Dans ce cas, votre programme devrait revenir qu'il n'y a pas d'équation possible égale avec 24. P>
Remarque: bien que nous entrions 4 entiers entre 1 et 9, nous utiliserons des doubles pour calculer toutes les opérations. Par exemple, les nombres 3,3,8,8 peuvent être combinés dans la formule: 8 / (3-8 / 3) = 24. P>
workflow: votre programme doit lire les 4 chiffres de l'utilisateur et produire une formule qui entraîne 24. L'algorithme doit énumérer toutes les commandes possibles de 4 chiffres, toutes les combinaisons possibles et toutes les formules possibles. P>
qui me conduit à 24 permutations de nombres A, B, C, D et 64 Permutations des opérateurs Voici mon code: P> + - / * Code>. Comment je suis arrivé à cette conclusion était de 4 ^ 3 4 opérateurs seulement 3 remplir des taches dans l'équation. Sauf aujourd'hui, j'ai du mal à écrire la méthode d'évaluation et à la comptabilisation des parentées dans les équations. P> public static void evaluate(cbar [][] operations , double [][] operands)
{
/*
This is the part that gets me how am I supposed to account
for parentases and bring all these expressions togather to
actually form and equation.
*/
}
3 Réponses :
Je vous recommanderais d'utiliser une arborescence pour stocker l'équation, c'est-à-dire un arbre syntaxique dans lequel la racine représente et l'opérateur ayant deux enfants représentant les opérandes et ainsi de suite de manière récursive. Vous auriez probablement un code plus propre le faire comme ça, car vous n'avez pas besoin de générer les combinaisons des opérandes "à la main", mais vous pouvez créer un code qui choisit tous les opérandes à partir d'un caractère [] 1 dimensions []. Nouveau Char [] {'+', '-', '*' ',' / '} tableau. P>
Si vous ne voulez pas utiliser d'arborescence syntaxique ou que vous ne pensez pas que votre cas d'utilisation, vous pouvez toujours essayer de trouver un moyen différent de créer le code pour choisir des opérandes de la matrice à 1 dimension et de les stocker dans un Différente structure de données. Mais je voudrais surtout éviter d'écrire toutes les combinaisons que vous faites. Il n'a pas l'air très facile à entretenir. P>
Ce problème présente plusieurs défis. Ma solution ci-dessous est d'environ deux cents lignes de long. Il est probablement un peu plus long que l'affectation nécessite car je l'ai généralisé à un certain nombre de termes. Je vous encourage à étudier l'algorithme et à écrire votre propre solution.
Les principaux obstacles que nous devons surmonter sont les suivants. P>
Comment générer des permutations sans répétition? P> LI>
Comment construisons-nous et évaluons des expressions arithmétiques? p> li>
Comment convertissons-nous les expressions en chaînes uniques? p> li> ul>
Il existe de nombreuses façons de générer des permutations. J'ai choisi une approche récursive parce que c'est facile à comprendre. La complication principale est que les termes peuvent être répétés, ce qui signifie qu'il peut y avoir moins que Pour éviter les permutations de duplication, nous commençons par trier les termes. La fonction récursive trouve des endroits pour tous les termes en double de gauche à droite sans retour en arrière. Par exemple, une fois que le premier Pour construire des expressions arithmétiques, nous utilisons une autre fonction récursive. Cette fonction examine chaque position entre deux termes de permutation, sévissant le tableau dans un segment à gauche de la position et un segment à droite. Il fait une paire d'appels récursifs pour construire des expressions pour les segments gauche et droit. Enfin, il rejoint les expressions d'enfants qui en résultent avec chacun des quatre opérateurs arithmétiques. Le boîtier de base est lorsque la matrice est de taille unique. Il ne peut donc pas être divisé. Il en résulte un nœud sans opérateur et aucun enfant, seulement une valeur. P> Évaluation des expressions en effectuant des arithmétiques sur Le dernier morceau du puzzle convertit les expressions en chaînes. Nous voulons fabriquer des cordes canoniques ou normalisées afin que nous ne nous répétaons pas inutilement. Par exemple, nous ne voulons pas afficher Nous pouvons y parvenir en ajoutant des parenthèses uniquement si nécessaire. À l'esprit, les parenthèses sont nécessaires si un nœud avec un opérateur de priorité supérieur (multiplication ou division) est le parent d'un nœud avec un opérateur de priorité inférieure (addition ou soustraction). Par priorité, je veux dire la priorité de l'opérateur, également appelée l'ordre des opérations. Les opérateurs plus prioritaires se lient plus étroitement que les basses inférieures. Donc, si un nœud parent a une priorité plus élevée que l'opérateur d'un nœud enfant, il est nécessaire de parent les parenthèses de l'enfant. Pour que nous nous retrouvons avec des chaînes uniques, nous les vérifions contre un jeu de hash avant de les ajouter à la liste de résultats. P> Le programme suivant, 4! = 4 * 3 * 2 * 1 code> permutations. Par exemple, si les termes sont 1 1 1 2 CODE>, il n'y a que quatre permutations. P> 1 code> a été placé dans la matrice, tous les termes restants 1 code> sont placés à la droite de celui-ci. Mais lorsque nous arrivons à un terme 2 code>, nous pouvons revenir au début de la matrice. P> Double CODE> Valeurs serait problématique en raison de l'imprécision du point flottant division. Par exemple, 1.0 / 3 = 0.33333 ... code>, mais 3 * 0,33333 ... = 0,99999 ... code>. Cela rend difficile de savoir certainement que 1/3 * 3 = 1 code> Lorsque vous utilisez des valeurs code> double code>. Pour éviter ces difficultés, j'ai défini une classe code> fraction code>. Il effectue des opérations arithmétiques sur les fractions et simplifie toujours le résultat au moyen du plus grand diviseur commun. La division par zéro n'entraîne pas un message d'erreur. Au lieu de cela, nous stockons la fraction 0/0. P> 1 + (1 + 2)) code> et (((1 + 1) + 1) + 2 code>, car ces sont essentiellement la même expression. Au lieu de montrer toutes les parenthèses possibles, nous voulons simplement afficher 1 + 1 + 1 + 2 code>. P> équation.java code>, accepte l'entrée de l'utilisateur sur la ligne de commande. Les paramètres du jeu sont sur la première ligne de la classe Code> Equation Code>. Vous pouvez les modifier pour créer des expressions avec plus de termes, de plus grandes termes et de différentes valeurs cibles. P>
J'ai réparé le casse-tête similaire avec le code ci-dessous. voici des tests p>
Question rapide, est-ce absolument nécessaire d'inclure une affaire
A + B code> si vous avez déjà le casB + A code>? Si ce n'est pas nécessaire, cela pourrait être réduit et la parenthèses traitée assez facilement.Dupliqué possible de maths vingt-quatre jeu Java
C'est ceci un devoir?
Ya c'est une mission de devoirs et y a également un moyen de créer une méthode d'évaluation?