Je bloque depuis 1h30 sur un exercice sur France IoI, où je me forme à Java depuis une semaine. J'ai abordé ce matin même la notion de boucle avec while, et ce n'est pas une mince affaire.
Voici l'intitulé de l'exercice :
Les habitants adorent les constructions en forme de pyramide ; de nombreux bâtiments officiels ont d'ailleurs cette forme. Pour fêter les 150 ans de la construction de la ville, le gouverneur a demandé la construction d'une grande et majestueuse pyramide à l'entrée de la ville. Malheureusement, en ces périodes de rigueur budgétaire, il y a peu d'argent pour ce projet. Les architectes souhaitent cependant construire la plus grande pyramide possible étant donné le budget prévu.
Trois exemples de pyramides, de hauteur 1, 2 et 3
Ce que doit faire votre programme :
Votre programme doit d'abord lire un entier : le nombre maximum de pierres dont pourra être composée la pyramide. Il devra ensuite calculer et afficher un entier : la hauteur de la plus grande pyramide qui pourra être construite, ainsi que le nombre de pierres qui sera nécessaire.
Exemples
Exemple 1
entrée :
20
sortie :
3
14
Exemple 2
entrée :
26042
sortie :
42
25585
Au niveau de la compréhension, ça va. Je dois calculer la hauteur maximale et le nombre de pierres à utiliser par rapport à un nombre de pierres données. Si mon nombre de pierres dépasse, le niveau n'est pas entier et ne compte pas. Le nombre de pierres à utiliser ne peut donc être que inférieur ou égal au nombre de pierres maximal. Je sais qu'à chaque niveau, la largeur du niveau prend +1
J'ai donc réussi à coder ceci :
import algorea.Scanner;
class Main {
static Scanner input = new Scanner(System.in);
public static void main (String[] args) {
int maxPierres = input.nextInt();
int nbPierres = 0;
int hauteur = 0;
while ((nbPierres + (hauteur+1*hauteur+1)) <= maxPierres) {
hauteur += 1;
nbPierres += (hauteur * hauteur);
}
System.out.println(hauteur);
System.out.println(nbPierres);
}
}
Cependant, les résultats aux différentes séries de tests ne passent, dans le meilleur des cas j'ai 36% de tests réussis, et je ne comprends pas où j'ai faux. Je ne comprends même pas pourquoi certains tests sont OK et d'autres pas :/
Si vous aviez une piste à me donner, je serais preneuse, j'aimerai finir ma semaine sur un exercice validé
Cordialement,
- Edité par HappyBadger 18 octobre 2019 à 15:48:15
"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"
Vraiment personne pour me renseigner, me guider, me donner une piste ?
EDIT :
Bonjour,
A force de tourner en rond et de tester, j'ai fini par trouver la ligne qui me manquait !!!
Sans donner la solution complète, voici comment se déroule le code :
On part d'une valeur de pierres max que l'on va nous donner.
Par défaut, on initie notre notre de pierre de départ et notre niveau de départ à 1
Afin d'éviter les erreurs dans les tests, on met une première condition : si le nombre de pierres proposé est 0, on repasse nos variables pierres et hauteur à 0, évidemment
Ensuite, c'est comme aux échecs, il faut toujours prévoir un coup d'avance !
Donc si le niveau suivant est inférieur ou égal au nombre de pierre max et tant que le niveau suivant est inférieur ou égal au nombre de pierres max, on incrémente nos niveaux et on recalcule notre nombre de pierre
J'ai donc mis 3 jours et 64 soumissions à tourner autour de la solution xD
Bon courage à vous !
- Edité par HappyBadger 21 octobre 2019 à 9:29:41
"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"
Si ça peut t'aider, le nombre de pierres nécessaires pour une pyramide de taille n est Σ(0,n) n2.
n=0 --> 0
n=1 --> 1 (0+1)
n=2 --> 5 (0+1+4)
n=3 --> 14 (0+1+4+9)
n=4 --> 30 (0+1+4+9+16)
...etc...
Donc pour un nombre de pierres données, tu peux par exemple boucler sur cette formule tant que ça ne dépasse pas le nombre de pierres.
Si par exemple on te donne 28 pierres, tu peux faire le rang 1 (1), le rang 2 (4+1=5), le rang 3 (9+4+1=14), mais pas le rang 4 (30>28) qui génère donc la sortie de la boucle.
Je n arrive pas à voir où est le problème est ce que c t’es pour cela que le programme marche pas ?
Non, pour le programme (le premier posté) de l'auteur du sujet, l'algo est bon et fonctionne en fait. Il a fait une erreur dans la condition de sa boucle:
hauteur+1*hauteur+1
est faux. Il a oublié la priorité des calculs (multiplication avant addition) donc il calcul 2 hauteur + 1 au lieu du carré de la hauteur.
C'est vraiment le genre de petite erreur qu'on peut facilement loupé (je ne l'avais pas vu la 1ère fois) parce qu'en lisant en diagonale, on pense tous au carré de la hauteur.
Pour celui en python, c'est bien l'algo qui est faux (ou mal implémenté) au niveau de la boucle.
Je n arrive pas à voir où est le problème est ce que c t’es pour cela que le programme marche pas ?
Non, pour le programme (le premier posté) de l'auteur du sujet, l'algo est bon et fonctionne en fait. Il a fait une erreur dans la condition de sa boucle:
hauteur+1*hauteur+1
est faux. Il a oublié la priorité des calculs (multiplication avant addition) donc il calcul 2 hauteur + 1 au lieu du carré de la hauteur.
C'est vraiment le genre de petite erreur qu'on peut facilement loupé (je ne l'avais pas vu la 1ère fois) parce qu'en lisant en diagonale, on pense tous au carré de la hauteur.
Pour celui en python, c'est bien l'algo qui est faux (ou mal implémenté) au niveau de la boucle.
Merci
Mais du coup pour le python j arrive pas à trouver la solution 🤨
j ai essayé plusieurs solutions mais rien ne change je n arrive passé voir où se trouve le problème
déplus sur le site france ioi ils mettent 13 tests sur 14 sont validés
Bonjour, par principe, est-ce possible d'arrêter de poser des questions dont le sujet est en résolu ? ca fait qu'en général les gents ne viennent plus dessus.
De plus, pour une question en python, il faudrait surtout aller sur le salon dédié à ce langage.
Bonjour, par principe, est-ce possible d'arrêter de poser des questions dont le sujet est en résolu ? ca fait qu'en général les gents ne viennent plus dessus.
De plus, pour une question en python, il faudrait surtout aller sur le salon dédié à ce langage
"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"
Albus Dumbledore
Potterhead forever, proud Hufflepuff
"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"
Albus Dumbledore
Potterhead forever, proud Hufflepuff
"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"
Albus Dumbledore
Potterhead forever, proud Hufflepuff
"Ce sont nos choix qui montrent qui nous sommes, bien plus que nos aptitudes"
Albus Dumbledore
Potterhead forever, proud Hufflepuff