Mon programme donne une valeur fausse

Résolu
domxaline -  
 domxaline -
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
A voir également:

12 réponses

zoubiock Messages postés 57 Date d'inscription   Statut Membre Dernière intervention   10
 
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 26003 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
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
domxaline
 
quel est la correction s'il te plaît
0
domxaline
 
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   Statut Membre Dernière intervention   10
 
voilà ! ou comme ça si tu veux:

{
factorieln_p = i * factorieln_p;
}
0
Char Snipeur Messages postés 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
domxaline
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
domxaline
 
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
domxaline
 
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 9813 Date d'inscription   Statut Contributeur Dernière intervention   1 299
 
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
domxaline
 
merci beaucoup
0