Inscription / Connexion Nouveau Sujet
Niveau exercices
Partager :

nombre de chiffres

Posté par
flight
21-06-24 à 23:07

Bonsoir

je vous propose l'exercice qui suit  ( .. assez simple ) .
Trouver une petite formule qui donne le nombre de chiffres d'un entier elevé au carré   par exemple  125² possède 5 chiffres

Posté par
dpi
re : nombre de chiffres 22-06-24 à 08:29

Bonjour,

 Cliquez pour afficher

Posté par
dpi
re : nombre de chiffres 22-06-24 à 08:57

Suite,
En testant,je corrige ...

 Cliquez pour afficher

Posté par
Imod
re : nombre de chiffres 22-06-24 à 10:11

Bonjour

Pour un entier n le nombre de chiffres de n² est :

 Cliquez pour afficher
Imod

Posté par
flight
re : nombre de chiffres 22-06-24 à 13:39

Bonjour et bravo
Une expression simple pour le nombre de chiffres de n2:
N =E(2.log(n))+1

Posté par
dpi
re : nombre de chiffres 22-06-24 à 14:31

Mon système fonctionne sans logarithme.
l'expression de imod  est bonne avec ln
celle de flight est bonne avec log

Posté par
Ulmiere
re : nombre de chiffres 22-06-24 à 21:34

C'est une question d'âge sans doute, mais pour moi \log = \ln et on j'écris explicitement \log_{b} pour le log en base b.

La formule vient simplement du fait qu'un nombre p a n chiffres en base b si et seulement si b^{n-1} \leqslant p < b^{n}, parce que le plus grand nombre à n-1 chiffres a pour écriture \overline{(b-1)(b-1)\ldots (b-1)} = \overline{b^n-1}.
Cette inégalité est équivalente à n-1\leqslant \log_b(p) < n, qui équivaut à son tour à n-1 = \left\lfloor\log_b(p)\right\rfloor.

Un autre truc rigolo mais sans rapport est le fait que pour tout réel x, \lfloor x\rfloor = -\lceil -x\rceil, ce qui veut dire que \left\lceil\frac{a}{b}\right\rceil = -\left\lfloor\frac{-a}{b}\right\rfloor = -\left\lfloor\frac{a}{-b}\right\rfloor.
Donc en python, pas besoin de se fatiguer à écrire importer math.ceil

import math
def div_ceil(a, b):
  return math.ceil(a / float(b))

il suffit d'écrire
def div_ceil(a, b):
  return -( (-a) // b )


L'égalité est vraie parce que n = \lfloor x\rfloor  \iff n \leqslant x < n+1 \iff -n-1 < -x \leqslant -n \iff \lceil -x\rceil = -n

Posté par
Ulmiere
re : nombre de chiffres 22-06-24 à 21:49

Désolé, il y a des coquilles mais dans le code je voulais dire

return int(math.ceil(a / float(b)))


En plus d'être moche, ça nécessite de convertir a et b en float (donc ne marche pas avec des fractions de précision arbitraire ou autre type rationnel) et ça renvoie un float qu'il faut convertir en int ensuite.
La méthode avec l'opérateur // ne fait aucune conversion en flottant (sauf mauvaise implémentation) et renvoie déjà un int.

Allez j'en profite pour fourrer une autre astuce : le complément à 2 sur lequel fonctionne la négation arithmétique (par opposition au complément à 1 pour la négation bit à bit) fait que ~x est en fait égal à -x-1.
Donc au lieu d'écrire tableau[len(tableau)-1-i], écrivez tableau[~i]. Et aussi, floor(logb(1.0/p))+1 = -(-floor(-logb(p))-1) = -~-ceil(logb(p)).

Posté par
dpi
re : nombre de chiffres 23-06-24 à 06:51

>Ulmiere,
Comme les formules  de Imod et de flight différent, c'est qu'ils ont utilisé le logarithmes de façon différente.

Posté par
LittleFox
re : nombre de chiffres 24-06-24 à 11:46

@Ulmiere
Je ne suis pas sûr qu'en python ce soit intéressant de rendre si peut clair le code pour un gain de performance plutôt minime.

En python 3.10+, math.ceil retourne déjà un entier.
En python 3.x, il n'y a pas besoin de convertir b en float, l'opérateur de division retourne déjà un float.
Mais je suis d'accord qu'il n'y a pas besoin de passer par les floats et que ça peut poser problème pour les grand nombres entiers.
J'utilise personellement (a+b-1)//b

J'ai déjà vu la notation tableau[~i] pour indexer depuis l'arrière. Je la trouve élégante. Mais en partique elle est très peu utilisée et apporte plus de confusion qu'autre chose.
Note: On écrit habituellement tableau[-1-i] pas besoin de rajouter la longueur du tableau en python.

Posté par
Ulmiere
re : nombre de chiffres 24-06-24 à 13:05

Il y a encore beaucoup de code qui tourne encore sous python 3.x avec x < 10, voire même python 2.
Si on peut éviter les imports inutiles ou les __import__("math").ceil()...
La seule objection que j'ai contre (a+b-1)//b, c'est que b est référencé deux fois, donc il faut d'abord créer une variable b = f() avant d'inliner cette formule, alors que tu peux écrire directement -((-a)//f()).

L'intérêt de ~i, c'est surout pour éviter les offset by one.
Par exemple si tu as deux tableaux de longueur n

for i in range(n):
  a = tab1[i]
  b = tab2[-1-i]


est moins clair que la même chose avec tab2[~i]. C'est vraiment le ième élément en partant de la fin et indexé à partir de 0, alors que -i indexe à partir de 1.

Posté par
LittleFox
re : nombre de chiffres 24-06-24 à 13:27

La dernière version de python 2.x est sortie il y plus de 4 ans. 2.x est obsolete depuis bien plus longtemps que celà.
Python 3.10 est sorti il y a plus de 2 ans.

Le standard dans ma profession est mettre à jour vers 3.11 et utiliser 3.12 pour le nouveau code.

Après je ne tout dépend de ce que tu fais avec. Je préfère de loin un import (d'une librairie incluse d'office de plus) qu'un code difficile à lire et maintenir.
De la même façon, donner un nom à une valeur aide à la lisibilité et donc je préfère de loin déclarer b plutôt qu'inliner f() et tous ses arguments.

Pour tab[~i], je suis d'accord avec toi. Sauf que l'opérateur ~ est trop rarement utilisé (en python) pour que cette notation soit évidente pour la plupart des gens.
Je l'ai vu dans des 'code golf' (on essaie de minimiser le nombre de caractères) et avec numpy pour inverser une sélection. Par exemple: array[~array.isnan()].



Vous devez être membre accéder à ce service...

Pas encore inscrit ?

1 compte par personne, multi-compte interdit !

Ou identifiez-vous :


Rester sur la page

Désolé, votre version d'Internet Explorer est plus que périmée ! Merci de le mettre à jour ou de télécharger Firefox ou Google Chrome pour utiliser le site. Votre ordinateur vous remerciera !