Mon programme donne une valeur fausse

Résolu/Fermé
domxaline - 13 août 2009 à 11:56
 domxaline - 13 août 2009 à 16:48
Bonjour,
bonjour
mon programme donne une valeur fausse
j'ai ecrit un programme qui demande à l' utilisateur de saisir deux entiers positifs non nuls p et n. p étant bien sûr inférieur à n. Puis le programme affiche la combinaison de p dans n.
voilà la formule
n!/p! * (n-p)!

package Mesessaies;
import java.util.Scanner;
public class exercice1
{
public static void main (String []args)
{
int p,n; int factorielp=1,factorieln=1,factorieln_p=1;
Scanner sc=new Scanner(System.in);
System.out.print("entrez un nb entier non nul p:");
p=sc.nextInt();
System.out.print("entrez un nb entier non nul supérieur à p:");
Scanner sc1=new Scanner(System.in);
n=sc.nextInt();
for(int i=1; i<=n; i++)
{
factorielp+=i;
}
for (int i=1; i<=n;i++)
{
factorieln+=i;
}
int n_p=n-p;
for (int i=1; i<=n_p; i++)
{
factorieln_p +=i;
}
int combinaison=(factorieln)/(factorielp)*(factorieln_p);
System.out.println( "valeur combinaison="+combinaison) ;
}
}

resultat
entrez un nb entier non nul p:3
entrez un nb entier non nul n supérieur à p:9
valeur de combinaison =:22

après la forumule, valeur de combinaison doit être 18 mais le prg trouve 22
n/p*(n-p)
9/3*(9-3)
3*6=18

Où est ce que je fais erreur ? veuillez m’expliquez s’il vous plaît

12 réponses

zoubiock Messages postés 57 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 2 mars 2010 10
13 août 2009 à 12:02
De souvenir, n! = n * (n-1) * (n-2) *... * 1

On dirait que tu fais la somme
for (int i=1; i<=n_p; i++)
{
factorieln_p +=i;
}

De plus, dans ton test, tu oublies le factoriel:
n/p*(n-p)
9/3*(9-3)
3*6=18
1
dna.factory Messages postés 24928 Date d'inscription mercredi 18 avril 2007 Statut Modérateur Dernière intervention 16 avril 2024 1 609
13 août 2009 à 12:09
je vois pas l'utilisation de la factorielle dans ton calcul humain, c'est normal ?

petit rappel factionel de n = 1*2*3*...*n
0
quel est la correction s'il te plaît
0
est ce qu'il faut corrriger comme ça?
{
factorieln_p *=i;
}
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zoubiock Messages postés 57 Date d'inscription mardi 12 mai 2009 Statut Membre Dernière intervention 2 mars 2010 10
13 août 2009 à 12:22
voilà ! ou comme ça si tu veux:

{
factorieln_p = i * factorieln_p;
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 août 2009 à 12:25
la correction semble correct, il faut en effet multiplier.
Il serait mieux de faire une fonction factorielle plutôt que de faire trois boucles.
Ton programme gagnerai en souplesse et en lisibilité.
à ta place, je ferai attention au cas où tu as 0 comme valeur, et 0!=1.
Et aussi, la formule c'est :
n!/(p!*(n-p)!) si tu oublie les parenthèse, c'est différent.
0
j'ecris ainsi

package Mesessaies;
import java.util.Scanner;
public class exercice1
{
public static void main (String []args)
{
int p,n; int factorielp=1,factorieln=1,factorieln_p=1;
Scanner sc=new Scanner(System.in);
System.out.print("entrez un nb entier non nul p:");
p=sc.nextInt();
System.out.print("entrez un nb entier non nul n supérieur à p:");
Scanner sc1=new Scanner(System.in);
n=sc.nextInt();
for(int i=1; i<=n; i++)
{
factorielp=i*factorielp;
}
for (int i=1; i<=n;i++)
{
factorieln=i*factorieln;
}
int n_p=n-p;
for (int i=1; i<=n_p; i++)
{
factorieln_p +=i;
}
resultat
entrez un nb entier non nul p:2
entrez un nb entier non nul n supérieur à p:6
valeur de combinaison =:11

valeur combinaison est 11 au lieu de 12
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 août 2009 à 14:05
tu as laissé += à la place de *= au calcul du dernier factoriel.
Tu aurai fait comme je t'ai dit : une fonction, tu n'aurai pas eu ce problème, tu aurais modifier une seule fois la fonction et tu aurais eu tes trois termes calculer correctement.
La règle en informatique, c'est de faire un code de manière à ce que lorsque tu changes quelque chose dans ton code, tu es le moins de modification à faire.
Le plus propre serait de faire une fonction factorielle et une fonction combinatoire, ça te permet beaucoup plus de souplesse et d'évolution par la suite.
0
excuse moi, peux tu m'ecrire mon programme complet avec la correction
s'il te plaît
je suis dans les nuages,merci beaucoup
0
peux tu corriger simplement cette partie

for(int i=1; i<=n; i++)
{
factorielp+=i;
}
for (int i=1; i<=n;i++)
{
factorieln+=i;
}
int n_p=n-p;
for (int i=1; i<=n_p; i++)
{
factorieln_p +=i;
}
0
Char Snipeur Messages postés 9696 Date d'inscription vendredi 23 avril 2004 Statut Contributeur Dernière intervention 3 octobre 2023 1 297
13 août 2009 à 15:35
remplace tout les += par des *=. C'est tout.
Ensuite, je ne suis pas très douer en java, il vaut mieux que tu fasses le programme entier seul. Mais suit mes conseils, il te seront réellement utiles dans la suite.
0
merci beaucoup
0