|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité régulier
![]() Étudiant Inscription : janvier 2013 Messages : 9 ![]() |
Bonjour, le programme construit et affiche le triangle de pascal selon la formule C(n, p) = n!/p!(n-p)! . Mon code source compile très bien et affiche le triangle pour n = 1 à 12, a partir de n >= 13, le programme affiche le triangle mais avec de faux coefficient.
Voici mon code source Code :
|
||
|
|
00
|
|
|
#2 | ||
|
Membre éprouvé
![]() ![]() Inscription : juillet 2006 Messages : 322 ![]() |
Chez moi (FreeBSD, testé avec clang et gcc) cela fonctionne très bien si ce n'est 5 warnings :
Code :
|
||
|
|
00
|
|
|
#3 | ||
![]() ![]() Jérôme Inscription : septembre 2009 Messages : 5 163 ![]() |
Bonjour,
Dans un premier temps corrige les avertissements montrés par _-Slash-_, puis je t'invite à regarder le résultat de ceci : Code :
|
||
|
|
00
|
|
|
#4 | |||
|
Invité régulier
![]() Étudiant Inscription : janvier 2013 Messages : 9 ![]() |
Citation:
le programme fonctionne très bien pour n <=12, pour n = 13 ou plus ça affiche le triangle mais pas avec les bons coefficients a partir de n = 13 Merci. |
|||
|
|
00
|
|
|
#5 | |||
|
Invité régulier
![]() Étudiant Inscription : janvier 2013 Messages : 9 ![]() |
Citation:
Est-ce-qu'il y a une façon d'y remedié? Merci. |
|||
|
|
00
|
|
|
#6 | |||
|
Membre éprouvé
![]() ![]() Inscription : juillet 2006 Messages : 322 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#7 | ||
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 430 ![]() |
Il ne faut pas procéder de cette façon : Pour calculer C(n,p) tu passes par le calcul de n! qui est rapidement très grand devant la valeur de C(n,p) et qui va dépasser la capacité de l'entier utilisé et donc fausser le résultat.
La meilleure solution, et la plus rapide, est de calculer C(n,p+1) à partir du calcul de C(n,p) par la relation C(n,p+1)=C(n,p)*(n-p)/(p+1) Code :
__________________
Publication : Concepts en C Mon avatar : Glenn Gould -------------------------------------------------------------------------- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
|
||
|
|
20
|
|
|
#8 | |||
|
Invité régulier
![]() Étudiant Inscription : janvier 2013 Messages : 9 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#9 | |||
|
Invité régulier
![]() Étudiant Inscription : janvier 2013 Messages : 9 ![]() |
Citation:
|
|||
|
|
00
|
|
|
#10 | |||
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
Moi j'ai une solution que je pense encore meilleure et encore plus rapide Si on se souvient que C(n, p) et C(p-n, p) sont identiques et peuvent se calculer en bouclant de n à p Exemple: C(3, 8) = C(5, 8) = 6 x 7 x 8 / 1 x 2 x 3 Et si en plus on prend en compte les valeurs particulières C(1, p)=1; C(2, p) = 2; C(p-2, p)=2 et C(p-1, p)=1 on peut encore optimiser un peu plus Ce qui donnerait Code c :
La multiplication et division simultanée dans le calcul du résultat lui évite de monter trop haut par rapport à sa capacité (dans laquelle on gagne encore une puissance de 2 par l'utilisation du unsigned)...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|||
|
|
00
|
|
|
#11 | |
![]() ![]() Patrick GonordEnseignant Chercheur Inscription : juin 2005 Messages : 5 430 ![]() |
@Sve@r
Je crois que tu as inversé dans ta notation c(x,y) celle utilisée par l'auteur du post qui est C(n,p) = n!/p!/(n-p)! et (je crois) que tu notes C(p,n) = n!/p!/(n-p)! Citation:
Compte tenu du programme proposé, qui n'est pas de calculer les C(n,p) dans un ordre aléatoire, mais dans un ordre bien particulier, la formule de récurrence permet de calculer un élément par cette unique opération : C(n,p+1)=C(n,p)*(n-p)/(p+1).
__________________
Publication : Concepts en C Mon avatar : Glenn Gould -------------------------------------------------------------------------- Une réponse vous a été utile ? Remerciez son auteur en cliquant le pouce vert !
|
|
|
|
10
|
|
|
#12 | |
|
Expert Confirmé Sénior
![]() ![]() Frédéric Ingénieur développement logiciels Inscription : février 2006 Messages : 3 495 ![]() |
Citation:
Exact, pas tiptop de poster les yeux encore embrumés de sommeil... C(0, p)=1, C(1, p)=p, C(p-1, p)=p et C(p, p)=1 Mais n'est-ce pas mieux d'avoir une fonction pouvant calculer directement et facilement n'importe quel C(n, p) sans avoir à calculer ou mémoriser les C(n, p) précédents ??? Une fonction plus générale et elle non plus pas gourmande en termes de grandeur de nombres pourra s'adapter à ce cas particulier tout en restant utilisable pour d'autres problèmes utilisant C(n, p)...
__________________
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche. Tout ce qu'un individu reçoit sans rien faire pour l'obtenir, un autre individu a dû travailler pour le produire sans en tirer profit. Tout Pouvoir ne peut distribuer aux uns que ce qu'il a préalablement confisqué à d'autres car on n'accroît pas les biens en les divisant. Quand la moitié d'un peuple croit qu'il ne sert à rien de faire des efforts car l'autre moitié les fera pour elle, et quand cette dernière moitié se dit qu'il ne sert à rien d'en faire car ils bénéficieront à d'autres, cela s'appelle le déclin et la fin d'une nation. Dr. Adrian Rogers, 1931 |
|
|
|
10
|
Copyright © 2000-2013 - www.developpez.com