begin process at 2010 02 10 12:16:02
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths & Algorithmes

 > L'INFORMATIQUE AU SECOURS DES MATHS

L'INFORMATIQUE AU SECOURS DES MATHS


 Information sur la source

Note :
4,67 / 10 - par 3 personnes
4,67 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths & Algorithmes Niveau :Débutant Date de création :09/06/2004 Date de mise à jour :09/06/2004 21:05:19 Vu :1 709

Auteur : bonmau

Ecrire un message privé
Commentaire sur cette source (14)
Ajouter un commentaire et/ou une note

 Description

Dans un stade, 40000 spectateurs assistent à une chorégraphie exécutée sur la pelouse par plusieurs centaines de figurants qui se disposent d'abord en carré puis en triangle(avec 1 figurant sur la première ligne,2 sur la deuxième ligne,3 sur la troisième ligne et ainsi de suite...)
x x x x x
x x x x x
x x x x x
x x x x x
x x x x x

x
x x
x x x
x x x x
x x x x x
x x x x x x
Quelqu'un lance:"mais combien sont-ils?"
Un informaticien spectateur qui ne se sépare jamais de son portable,écrit un petit programme de 4 lignes et répond:" les figurants sont au nombre de...."
Pour la solution ,voyez le programme ci-joint.
Il y a évidemment moins de figurants que de spectateurs.
Si vous voulez chercher par vous même,ne regardez pas!

Source

  • #include <stdio.h>
  • #include<iostream.h>
  • #include<math.h>
  • /* Si L est le nb de lignes dans la disposition en triangle et N le nb de figurants:
  • N=1+2+3....+L
  • Donc N=L*(L+1)/2
  • Il s'agit par conséquent de rechercher une quantité L*(L+1)/2 qui soit un carré parfait avec une limitation sur L facile à trouver(N<40000) */
  • main()
  • {
  • double L;
  • for(L=0;L<285;L++)
  • if(sqrt(L*(L+1)/2)==floor(sqrt(L*(L+1)/2)))
  • cout<<L*(L+1)/2<<endl;
  • return 0;
  • }
#include <stdio.h>
#include<iostream.h>
#include<math.h>
/* Si L est le nb de lignes dans la disposition en triangle et N le nb de figurants:
N=1+2+3....+L
Donc  N=L*(L+1)/2
Il s'agit par conséquent de rechercher une quantité L*(L+1)/2 qui soit un carré parfait avec une limitation sur L facile à trouver(N<40000) */
main()
  {
    double L;
    for(L=0;L<285;L++)
       if(sqrt(L*(L+1)/2)==floor(sqrt(L*(L+1)/2)))
          cout<<L*(L+1)/2<<endl;
     return 0;
  }



 Sources du même auteur

Source avec Zip ORDINATEUR DEVIN
JOUR DE LA SEMAINE

 Sources de la même categorie

Source avec Zip OPERATION SUR LES MATRICES CARREES AVEC CLASSE GENERIQUE par chouhad
Source avec une capture OPÉRATIONS SUR MATRICES C++ par Minilogus
[DEV-C++] CALCUL DE LA RACINE CARRÉE D'UN RÉEL par Jhep
PROGRAMME QUI CALCUL LE PPCM ET LE PGCD par AnoSantino
EVALUER UNE EXPRESSION MATHÉMATIQUE par begueradj

Commentaires et avis

Commentaire de vecchio56 le 09/06/2004 17:57:37 administrateur CS

sans programme, on peut dire qu'ils peuvent être 0 ou 1 par exemple

Commentaire de bonmau le 09/06/2004 18:04:58

Un spectateur voit plusieurs centaines de figurants.Pour connaître leur nb exact,ou il les compte 1 par 1 -ce qui est fastidieux-,ou il utilise le programme qui lui donne la solution.

Commentaire de Cyberboy2054 le 09/06/2004 18:14:59

On a tous un jour révé un jour d aller au stade avec son ordinateur pour compter le nombre de personnes grace a 1 addition, 1 division et une multiplication ...
C est juste la formule mathématique pour calculer la somme des termes de 1 à N, jcapte pas a quoi sert la ligne
if(sqrt(L*(L+1)/2)/floor(sqrt(L*(L+1)/2))==1)

Commentaire de vecchio56 le 09/06/2004 18:49:15 administrateur CS

1)une autre solution est de de compter les personnes 2 par deux, en terminant éventuellement par un seule, à condition de savoir compter 2 par 2, ou bien compter le nombre de jambes et diviser par deux si c'est plus simple (un simple décalage de neurones à droite suffira)
2)comment sait-on qu'il y a moins de figurants que de spectateurs?
3)le monsieur ne se sépare jamais de son portable, mais il n'est pas très à cheval sur les normes c++, et par ailleurs il ne sait pas compter car son programme ne fait pas 4 lignes comme il le prétend

Commentaire de bonmau le 09/06/2004 19:06:29

Beaucoup trop de pédants sur codeSource et qui semblent  manquer d'humour.
Je n'écrirai plus de sources et je ne répondrai plus au commentaires.
Un dernier mot :la réponse est 1225,mais je suppose que nos esprits éclairés,qui sans doute n'ont pas compris le problème, l'avait trouvée en un claquement de doigts.

Commentaire de vecchio56 le 09/06/2004 19:18:33 administrateur CS

ceux qui manquent d'humour ne sont pas ceux que bonmau croit

Commentaire de BruNews le 09/06/2004 20:32:21 administrateur CS

Ben faut pas se facher, je ne vois personne ici qui ait joue le pedant dans ces commentaires. Un peu d'humour ne nuit pas. Il est vrai que nous avons parfois quelques grincheux mais le mieux est de ne pas en faire partie.

BruNews, Admin CS, MVP Visual C++

Commentaire de neo_00110010101 le 09/06/2004 21:55:20

alors qu'en faire de ceux-là ? ce problème se rapproche de celui des notes mais on n'est pas là pour ça ...

c'est assez difficile pour moi votre calcul ^_^

Commentaire de cosmobob le 09/06/2004 23:45:09

l'informatique peut elle répondre a la question : combient ya t'il de solutions ? assurément non, vu qu'elle ne peut en tester qu'un nombre fini.

Commentaire de vecchio56 le 09/06/2004 23:59:03 administrateur CS

les mathématiques peuvent-elles tout démontrer? non plus.

Commentaire de cosmobob le 10/06/2004 00:31:00

ben en tout cas les mathématiques permettent de dire que dans ce cas, il y a une infinité de solutions.
la résolution de ce probleme se ramene (facilement) a l'equation de pell-fermat avec n = 8 (cad a la résolution de 1+8b²=c²). j'ai essayé de la résoudre, mais visiblement c'est compliqué, et des mathématiciens comme euler l'on trouvé dur, ce qui explique qu'il y avait peu de chances que je trouve tout seul ;) la réponse est finalement qu'il y a une infinité de solutions. si j'ai le temps, je vais essayer de comprendre comment on trouve toutes les solutions de pell fermat, et donc on peut explicitement (ou au moins récursivement) donner toutes les solutions de ce probleme.

pour ceux que ca interessent, pour passer de a²+a-2b²=0 à l'equation dont j'ai parlé c'est simple:
il suffit d'exprimer a en fonction de b; et ici a = (-1+sqrt(1+8b²))/2
on voit qu'ill est nécessaire et suffisant (pour que a soit entier) que 1+8b² soit un carré, c'est a dire que b soit solution de l'équation 1+8b²=c².

voila.

Commentaire de StanOfSky le 10/06/2004 00:50:15

et c'est la qu'un mathémticien ingénieux se dit  que de taper ces fameuses 4 lignes de codes puis les compiler et enfin les exécuter (sachant qu'il fallai avoir pensé a prendre son pc) est bien plus long et fastidieux que d'utiliser ce fabuleux instrument qu'est son cerveaux (nb:pas besoin de penser à le prendre en principé il est tjs avec vous ;) )

c marrant comme probleme ca me rapelle un peu la spé math de term ;)
c juste un petit probleme d'arithmétique :

cas evident d'un point de vue mathématiques mais qui ne repondent pas aux probleme : 0 et 1
ensuite il faut plus au moins tester les cas possible en enlevant un maximum de cas impossible ;)

on sait que le nombre de figurants est de la forme L(L+1)/2 et de la forme N*N donc carré d'un entier
c la que le mathématicien se rend compte qu'il est difficile de supprimer les cas car le forme N*N nous permet juste de dérouler les N, et la forme L*(L+1)/2 ne nous permet meme pas de distinguer le cas pair d'impair puisque L*(L+1) est forcement pair...

la flemmardise le pousserai à demander à son voisin informaticien de faire un petit programme pour tester tous les cas (dans un interval fermé bien sur) mais il a sa TI!!! (encore de la flemmardise)
donc il va tester les premier cas rapidement a la main
tres rapidement en déroulant les N, au bout du 5e cas on voit quee N=6 fonctionne puisque N*N carré (évident) et L*(L+1)/2=36 pour L=8...
mais c la qu'il remarque que les figurants sont des centaines !!!
donc il faut N &gt;= 10 !!!
apres de laborieux tests il parvient à la solution qu'est 1225 pour n=35... (L=49)
il existe surement une méthodes pour éliminer plus de cas mais la j'ai po trouvé (chu seulement informaticien :p )

mais bon comme je suis informaticien :p je vais écrire le code que j'aurai posté (ecrit en bon c++ sans faire de caca avec des double(alors qu'on veu travailler qu'avec des entier))

#include &lt;iostream&gt;
#include &lt;math.h&gt;

int main()
{
for (int n = 2; n &lt; 200; n++)
{
int l = sqrt(n*n*2);
if (l*(l+1)/2 == n*n) std::cout &lt;&lt; n*n &lt;&lt; std::endl;
}
return 0;
}

Commentaire de cosmobob le 10/06/2004 01:22:56

bon en attendant, voici une maniere de construire une infinité de solutions a ce probleme, ce que l'informatique n'aurait pas pu faire.
on considère la suite double définie par:
x0=1, y0=3
x(n+1) = 3.xn+yn
y(n+1) = 8.xn+3.yn

je prétends que L = (yn-1)/2 vérifie L(L+1)/2 qui est un carré (pour tout n !!)
(y2 donne la valeur que ce programme trouve, cad le L tel que
L*(L+1)/2 vaut 1225)
en augmentant la valeur du L dans la boucle (limité a 285 ici), on aurait pu trouver L = 1681 qui marche aussi. mais bon avec ce que j'ai dit, on peut en déduire une infinité... (celui d'encore apres est L = 9800, puis L = 57121 etc..)
par contre, a la question : est ce que toutes les solutions (a part pour L = 0 et 1) apparaissent dans la suite, j'en sais rien. je pense cependant que oui.

Commentaire de cosmobob le 10/06/2004 02:08:45

bon et finalement voici la puissance des mathématiques ...

voici comment calculer de maniere explicite des valeurs de L qui marchent, elle dépendent juste d'un indice n que l'on peut prendre quelconque.

Ln = 1/sqrt(2) . [ (3+2sqrt(2))^n - (3-2sqrt(2))^n ] + 3/4. [ (3+2sqrt(2))^n + (3-2sqrt(2))^n ]  - 1/2

(sqrt(2) est la racine carré de 2)

exemples:
L0 = 1         (1*2/2 = 1²)
L1 = 8         (8*9/2 = 6²)
L2 = 49       (49*50/2 = 35²)
L3 = 288     (288*289/2 = 204²)
L4 = 1681   (1681*1682/2 = 1189²)
L5 = 9800   (9800*9801/2 = 6930²)
L6 = 57121  (57121*57122/2 = 40391)
etc...

c'est qd meme plus puissant qu'un programme qui teste toutes les valeurs !!

 Ajouter un commentaire




Nos sponsors


Sondage...

Comparez les prix

CalendriCode

Février 2010
LMMJVSD
1234567
891011121314
15161718192021
22232425262728

Consulter la suite du CalendriCode

 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 0,577 sec (4)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales