begin process at 2010 02 10 11:57:33
  Trouver un code source :
 
dans
 
Accueil > 

Code

 > 

Maths

 > LES PUISSANCES DE 2 QUI ENTOURENT UN NOMBRE

LES PUISSANCES DE 2 QUI ENTOURENT UN NOMBRE


 Information sur la source

Note :
3 / 10 - par 1 personne
3,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10
Catégorie :Maths Niveau :Débutant Date de création :29/11/2003 Date de mise à jour :29/11/2003 16:43:30 Vu :1 733

Auteur : peecota

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

 Description

ce program a pour but entourer un nombre strictement positif par les deux puissanes de 2 qui l'entourent
exemple :
           2^7=128   <145< 2^8=256
pour le compiler , utiliser turbo pascal

Source

  • program Puissances2Entourent;
  • var n,m,k:longint;
  • function psc(a:longint;n:shortint):longint;
  • var i:shortint;b:longint;
  • begin
  • b:=1;
  • i:=1;
  • while i <= n do
  • begin
  • b:=b*a;
  • i:=i+1
  • end;
  • psc:=b;
  • end;
  • begin
  • repeat
  • write('Entrez un nombre strictement positif (0/fin): ');
  • readln(n);
  • if n>0 then
  • begin
  • k:=0;
  • m:=n;
  • while m div 2>=1 do
  • begin
  • k:=k+1;
  • m:=m div 2
  • end;
  • writeln('2^',k,'=',psc(2,k),'<=',n,'<= 2^',k+1,'=',psc(2,k+1));
  • end
  • else writeln('warning!!!! le nombre doit être > 0');
  • until n=0;
  • end.
program Puissances2Entourent;
var  n,m,k:longint;
function psc(a:longint;n:shortint):longint;
     var i:shortint;b:longint;
     begin
     b:=1;
     i:=1;
     while i <= n do 
                    begin 
                           b:=b*a;
                            i:=i+1
                    end;
     psc:=b;
     end;
begin
     repeat
     write('Entrez un nombre strictement positif (0/fin): ');
     readln(n);
     if n>0 then 
     begin
     k:=0;
     m:=n;
     while m div 2>=1 do 
                               begin
                                k:=k+1;
                                m:=m div 2 
                               end;
     writeln('2^',k,'=',psc(2,k),'<=',n,'<= 2^',k+1,'=',psc(2,k+1));
     end
     else writeln('warning!!!! le nombre doit être > 0');
     until n=0;   
end.      

 Conclusion

pour sortir, entrez 0 comme nombre
c'est le 2eme promam que je publie sur ce site . comme vous pouvez le constater , ce n'est qu'un simple program . mais peut être qu'il sera util pour quelqu'un entre vous .
pour l'explication du fonctionnement ,dabord j'ai fait une fonction pour calculer la puissance . puis j'ai developpé le corps du program . je crois que la methode utilisée est assez simple.
merci de me signaler les erreurs.


 Sources du même auteur

DETECTION DU MOT LE PLUS LONG
DECOMPOSITION EN FACTEUR DE NOMBRES PREMIERS

 Sources de la même categorie

Source avec Zip Source avec une capture CONVERTISSEUR D'UN NOMBRE DÉCIMAL EN BINAIRE ET HEXADECIMAL par ludokk
Source avec Zip Source avec une capture PREMIER OU PAS? par ludokk
Source avec Zip Source avec une capture CONJECTURE DU CARRÉ DES FACTEURS par Bacterius
Source avec Zip Source avec une capture GÉNÉRATEUR DE NOMBRES PSEUDO-ALÉATOIRES par Bacterius
Source avec Zip Source avec une capture ALGORITHME DE HASH LEA par Bacterius

Commentaires et avis

Commentaire de Zeroc00l le 02/03/2004 13:00:56

Y'a plus simple pour trouver deux puissance de deux qui entourent un nombre ... Non ?   :----C

Soit xun entier quelconque et &gt;=1
Alors :

  Puissde2min := Trunc( ln(x-1) / ln(2) ) + 1;
  Puissde2max := Trunc( ln(x)    / ln(2) )      ;
  If  Puissde2min &gt; Puissde2max then Dec(Puissde2min);

Ca, ça devrait marcher ... (code écrit directement ici, j'ai pas testé ) et c'est bien plus court ! ;-J

Commentaire de Zeroc00l le 02/03/2004 13:45:13

Bon en mangeant et en y repensant je me suis aperçu que je m'étais trompé et que j'avais oublié les valeurs négatives (de plus je me suis planté dans les formules. Je les ai inversé ... C'est ça de vouloir tout faire trop rapidement. Forcément, ça joue des tours ...) donc voila une fonction plus courte ET qui marche ! :) :

Procedure Puissde2minmax( x : real; var min, max : integer);
begin
  If x = 1 then begin
     min := 0;
     max := 0;
  end else
     If x&lt;1 then begin
      min  := -Trunc( ln(1/x-1)  / ln(2) ) - 1;
      max := -Trunc( ln(1/x   )  / ln(2) );
     end else begin
      min  := Trunc( ln(x)    / ln(2) );
      max := Trunc( ln(x-1) / ln(2) ) + 1;
     end;
end;

voili voilo ! :)

Commentaire de Zeroc00l le 02/03/2004 13:47:28

* Plus courte et plus rapide que la tienne je pense.
* De plus on notera qu'on peut changer la base très simplement ... il suffit de changer les '2' ...

Commentaire de peecota le 12/10/2004 13:55:45

merci pour la regle mathematique, mais est que tu penses vraiment que votre methode est la plus rapide?
peut etre qu'elle est plus courte mais elle n'est pas plus rapide. en effet, vous vaez utilisez une fonction (ln)
donc votre program va detrerminer  des chifres apres la vergule qu'on en pas besoin. et ca prend du temps.
dans la majorites des program on peut toujours utiliser des fonctions predifinis mais le problem ce qu'ile ne sont pas toujours utils.

Commentaire de Zeroc00l le 12/10/2004 20:38:39

Oui...
Mais ça utilise moins de mémoire (pour de pas dire aucune !) et deuxio question vitesse je ne sais pas ... pour de grande puissance tu fais pas mal de divisions ...
de toute facon pour les puissances de 2 vive le C (ou l'assembleur).

Commentaire de grandvizir le 09/02/2005 19:53:33

La fonction LN n'est qu'un simple appel à une instruction en assembleur qui fait travailler seulement le coprocesseur arithmétique (ce qui n'est pas le processeur).

C'est bien plus rapide que de faire des boucles, car je connais un circuit électronique qui s'en fout royalement.

Il aurait été plus sympathique de faire un programme qui entoure d'une fraction un nombre irrationnel ou presque (car il y aura tjs des approximations avec les nombres flottants appilqués aux irrationnels). N'oublions pas que l'ensemble des rationnels est aussi dense que l'ensemble des réels. D'où la possibilité d'effectuer un encadrement.

On peut toujours utiliser la dichotomie si l'on veut, mais au final, le prog est faiblement intéressant et le logarithme de Zero00l met fin à toute discussion.

Commentaire de Zeroc00l le 11/02/2005 02:32:11

grandvizir : Où est le problème ?

Imaginons que je veuille encadrer PI :
Et bien il est  entre :
Valeur_Entiere_de(PI* 10^p) / (10^p)
et
Valeur_Entiere_de(PI* 10^p + 1) / (10^p)
avec p dans l'ensemble N (et PI une valeur machine dont tjrs < à la "vrai" valeur"

Ensuite a toi de simplifier la fraction ...
Donc aucune difficulté !
Par contre j'aimerais bien savoir comment calculer les decimale de PI, cad connaitre l' "algo" qui permet de les calculer... Ca, ça m'interesserais bcp !

 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,499 sec (3)

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