[ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Staple1600

XLDnaute Barbatruc
Bonjour à tous

Je m'amuse ce week-end avec cela : les nombres narcissiques
Nombre narcissique - Wikipédia



Voila l'état actuel des choses avec des nombres de trois chiffres c'est ok
mais avec plus Excel va finir pas ne pas être content.


J'attends avec impatience de lire vos interprétations en VBA.

EDITION: version qui prend en compte les nombres > 999
Code:
Sub test2()
Const m As String = " un nombre narcissique."
Dim s, n, i, x, op
s = InputBox("Saisir un nombre entier, svp", "TEST NOMBRE NARCISSIQUE", 371)
x = Len(s): n = Val(s)
For i = 1 To x
op = op + Val(Mid(s, i, 1)) ^ x
Next
MsgBox s & IIf(op = n, " est ", " n'est pas ") & m
End Sub

Première version (pour les nombres de 3 chiffres)
Code:
Sub test()
Const m As String = " un nombre narcissique."
Dim s, n, a, b, c, x, op
s = InputBox("Saisir un nombre entier, svp", "TEST NOMBRE NARCISSIQUE", 371)
x = Len(s): n = Val(s)
a = n \ 100: b = (n Mod 100) \ 10: c = n Mod 10
op = a ^ x + b ^ x + c ^ x
MsgBox n & IIf(op = n, " est ", " n'est pas ") & m
End Sub
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re

EDITION: même à 4000000 , Excel plante

Après quelques lectures sur le net

Nouvel état des choses

Si je passe à 10 000 000

Excel commence à suer, puis suffoquer et pour finir à rendre les armes ;)

QUESTION: Comment faire pour réussir avec Excel à au moins obtenir la liste des nombres narcissiques répertoriées sur Wikpédia ?
Les premiers entiers narcissiques sont : 1, 2, 3, 4, 5, 6, 7, 8, 9, 153, 370, 371, 407, 1634, 8208, 9474, 54748, 92727, 93084, 548834, 1741725, 4210818, 9800817, 9926315, 24678050, 24678051, 88593477, 146511208, 472335975, 534494836, 912985153, 4679307774, 32164049650, 32164049651
Pour le moment le code ci-dessous va jusquà : 1741725

Mais cela commence à ramer ;)

Code:
Sub test3()
N = 1
For i = 1 To 2000000
If ESTNARCISSE(i) Then
Cells(N, 1) = i
N = N + 1
End If
Next i
End Sub
Code:
Function ESTNARCISSE(ByVal N) As Boolean
L = Len(N): op = 0
For i = 1 To L
op = op + Mid(N, i, 1) ^ L
Next i
ESTNARCISSE = op = N
End Function
 
Dernière édition:

soenda

XLDnaute Accro
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Bonjour le fil, Stapple1600

j'ai effectué plusieurs tests avec le code suivant (...),
et je n'ai constaté aucun ralentissement.

Code:
Sub b()
    Dim ch As String
 
    ch = "912985153"
 
    If Val(ch) <= 2147483647 Then test ch
 
End Sub
 
 
Sub test(ch$)
    Dim p%, L%, t() As Integer
    Dim N&, tot As Long
 
    N = Val(ch)
    L = Len(ch)
    ReDim t(1 To L)
 
    For i = 1 To L
        t(i) = Val(Mid(ch, i, 1))
    Next
 
    While tot < N
 
        p = p + 1
        tot = 0
 
        For i = 1 To L
            x = t(i) ^ p
            If x + tot > N Then
                MsgBox ch & " n'est pas un nb narcissique"
                End
            Else
                tot = tot + x
            End If
        Next
    Wend
 
    MsgBox ch & " est un nb narcissique"
 
End Sub
A plus
 

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Bonjour soenda


D'après ce que j'ai lu existe 88 nombres narcissiques en base 10
http://mathworld.wolfram.com/NarcissisticNumber.html

Or avec le code actuel, je n'arrive à en lister que 20

après Excel plante.


Je vais essayer d'adapter ton code pour qu'il génère une liste plutôt que d'afficher une MsgBox
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re


En testant ton code ainsi, cela plante aussi Excel chez moi

Code:
Sub a()
for i=1 to 400
test Cstr(i)
Next
End Sub

Ainsi j'ai un dépassement de capacité

Si je change les déclarations de variable
Excel plante
 

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re


En relisant scrupuleusement les infos trouvées
Les points fixes de telles transformations (définies par la puissance p) et qui sont donc des nombres égaux à la somme des puissances p de tous leurs chiffres sont encore appelés des nombres narcissiques d'ordre p. Parmi eux, ceux qui possèdent en outre exactement p chiffres, sont dits narcissiques parfaits (ou nombres plus que parfaits ou nombres d' Amstrong). Il existe 88 nombres narcissiques parfaits (pour la représentation des entiers en base 10)d'après un résultat datant de 1985 (suivant les auteurs, on réserve d'ailleurs souvent le terme narcissique aux seuls narcissiques parfaits...), le plus grand étant un nombre de 39 chiffres.
ce que j'essaie de lister sont des nombre d'armstrong non ?
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Salut Staple1600,
Bonjour Soenda,

Je pense que pour arriver à calculer ces chiffres il vous faudra plus qu'un simple PC :p

Style un CRAY Jaguar avec 224162 processeurs 6 coeurs AMD, vitesse de calcul : 1,759 PFlops

Chez moi j'ai essayé également avec mon PC sur mesure
- Carte mère Gigabyte GA-X58-UD3R triple chanel
- I7 975 extreme edition à 3,6 Ghz
- 6 Go de DDR3-1600 MHz PC3-12800 Kingston HyperX

Et bien ça rame après la valeur de : 24678051
alors je ne vous raconte pas :D

A+
 
Dernière modification par un modérateur:

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Bonsoir BrunoM45


Et Excel dans l'histoire ?

Si on exécutait Excel sur ton CRAY Jaguar, il réussirait à inscrire ces 88 nombres dans mes 88 malheureuses cellules de la Feuille 1.

Aucun espoir de pouvoir biaiser alors ?

PS: tu as utilisé quel code vba?
car je ne me demande si je devrai pas déclaré les variables dans ESTNARCISSE ?
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re,

Si on exécutait Excel sur ton CRAY Jaguar, il réussirait à inscrire ces 88 nombres dans mes 88 malheureuses cellules de la Feuille 1.
Si on pouvait installer Excel dessus, oui je crois sans problème ;)

Sinon le code que j'ai essayé, est celui là
Code:
Sub TestBM45()
  Dim N As Long, Va As Variant
  'Application.Calculation = xlCalculationManual
  Application.EnableEvents = False
  Application.ScreenUpdating = False
  N = 1
  For Va = 1 To 9000000000000#
    If ESTNARCISSE(Va) = True Then
      Cells(N, 1) = Va
      N = N + 1
      Application.ScreenUpdating = True
      Application.ScreenUpdating = False
    End If
  Next Va
  Application.ScreenUpdating = True
  Application.EnableEvents = True
  'Application.Calculation = xlCalculationAutomatic
End Sub

Function ESTNARCISSE(ByVal V) As Boolean
  Dim J As Long, L As Long, Op As Variant
  L = Len(V): Op = 0
  For J = 1 To L
    Op = Op + (Mid(V, J, 1) ^ L)
  Next J
  ESTNARCISSE = Op = V
End Function
1) J'ai déclaré toutes les variables, le seul type qui peut fonctionner est "Variant"
2) j'ai supprimé tout rafraichissement d'écran, gestion d'évènements

Mais ça n'a pas l'air plus efficace

A+
 
Dernière modification par un modérateur:

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re


Avec ton code, c'est mieux , mais je finis toujours par planter Excel

(test ok pour : For Va = 1 To 9810000# ) : 9800817 (dernière valeur renvoyée avant plantage)

Excel ne plante pas chez toi :confused:

Chez moi, résultat immédiat du 1er au 19ème nombre, ensuite cela commence à ramer

PS: test fait sur Excel 2000/ Vista 2 Giga de Ram
 
Dernière édition:
C

Compte Supprimé 979

Guest
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re,

En fait ce n'est pas qu'Excel plante, mais le Handle de l'application ne renvoie pas assez rapidement à windows le fait qu'elle est occupée ...

Sinon quasi comme toi, immédiat jusqu'au 20ème puis ça rame :eek:
24ème au bout de quelques bonnes secondes
ensuite il faut attendre une à 5 minutes pour le 25 et 26
et après ben là y a problème .... ça calcul ... calcul ... calcul
enfin bref CTRL+ALT+SUP :D

A+
 

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Re


Souvent on peut lire sur le forum

"Avec Excel et VBA , on peut tout faire"

Est-ce à dire que l'on vient de trouver quelque chose que l'on ne peut pas faire avec Excel :D

( en laissant tourner Excel seul, moi aussi j'arrive à obtenir le 24éme nombre
au bout d'un certain temps :D )
 

jeanpierre

Nous a quitté
Repose en paix
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Bonjour Jean-Marie, Bruno,

C'est samedi après tout....

"Souvent on peut lire sur le forum

"Avec Excel et VBA , on peut tout faire"

Est-ce à dire que l'on vient de trouver quelque chose que l'on ne peut pas faire avec Excel"

Je dirais non car avec ce genre de calcul, qu'il soit fait avec Excel ou avec d'autres langages, va faire cramer le pc, donc cela confirme que l'on peut tout faire.

Pas les moyen, ni la place, d'avoir un CRAY xxx....

Bon week-end.

Jean-Pierre
 

ROGER2327

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Bonjour à tous
Précision : je traite d'abord le problème initialement posé par Staple1600 dans son premier message en m'en tenant à la définition des nombres narcissiques donnée par son lien vers Wikipédia.
Code:
[COLOR="DarkSlateGray"][B]Sub Nombres_narcissiques()
Dim i&, k&, n&, l&, p&, s&, a() As Long
   With Application
      .Calculation = xlManual: .EnableEvents = False
      Cells(1, 1) = 0: Cells(1, 2) = 1: Cells(2, 1) = 1: Cells(2, 2) = 0
      l = 2
      For n = 2 To 25000000
         k = Len(CStr(n))
         s = k
         ReDim a(1 To k)
         For i = k To 1 Step -1
            a(i) = CLng(Mid$(CStr(n), i, 1))
            s = s + (a(i) < 2)
         Next
         If s Then
            p = k - 2
            Do
               p = p + 1
               s = 0
               For i = 1 To k
                  s = s + a(i) ^ p
               Next
            Loop While s < n
            If s = n Then
               l = l + 1
               Cells(l, 1) = n
               Cells(l, 2) = p
            End If
         End If
      Next
      .EnableEvents = True: .Calculation = xlAutomatic
   End With
End Sub[/B][/COLOR]
On remarquera que la procédure donne par exemple 4150 car 4^5 + 1^5 + 5^5 + 0^5 = 4150.
L'article de Wikipédia confond les nombres narcissiques et les nombres narcissiques parfaits dont la définition est :
Un nombre narcissique parfait est un nombre entier positif à n chiffres égal à la somme de la puissance nième de chacun de ses chiffres.
Ainsi 4150 est narcissique mais n'est pas narcissique parfait car 4^4 + 1^4 + 5^4 + 0^4 = 882.
Il est vrai que la définition est assez variable dans la littérature mathématique, d'où la confusion...
S'il s'agit de trouver seulement les plus petits nombres narcissiques parfaits, je propose :
Code:
[COLOR="DarkSlateGray"][B]Sub Nombres_narcissiques_parfaits()
Dim i&, k&, n&, l&, s&
   With Application
      .Calculation = xlManual: .EnableEvents = False
      For n = 0 To 25000000
         k = Len(CStr(n))
         s = n
         For i = 1 To k
            s = s - CLng(Mid$(CStr(n), i, 1)) ^ k
         Next
         If s = 0 Then
            l = l + 1
            Cells(l, 4) = n
         End If
      Next
      .EnableEvents = True: .Calculation = xlAutomatic
   End With
End Sub[/B][/COLOR]
C'est similaire à la procédure de BrunoM45, en un peu plus rapide grâce à l'intégration de l'ensemble du code dans la même procédure.
Le choix du type Long pour n limite évidemment la portée de la procédure, mais le temps d'exécution devient tellement important lorsque n est grand que je doute qu'il y ait réellement intérêt à aller plus loin... Telles quelles, les durées d'exécution sont 209 et 332 secondes (machine portable, processeur cadencé à 1,66 MHz, 1 Go de mémoire vive).

Merci à Staple1600 de nous fournir un sujet inutile
qui nous sort du boursicotage
et des vilenies économiques...
ROGER2327
#2904
 

Staple1600

XLDnaute Barbatruc
Re : [ALGO][VBA]Nombre narcissique - comment faites vous ? (pour les grands nombres)

Bonjour ROGER2327


Heureux de vous croiser dans ce fil.

Évidemment je me précipite pour tester vos procédures et paf

Excel (ne réponds pas) trés rapidement. (et ce avec les 2 procédures )

Ce qui fait chez moi naitre un doute.

Y-aurait-il une instabilité chronique et aléatoire à utiliser Excel 2000 installé sur un PC sous Windows Vista ?

Merci d'avoir éclairer ce fil de vos lumières mathématiques ce fil et de m'avoir libéré de mon doute exprimé hier à 17h14.
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
667

Statistiques des forums

Discussions
312 338
Messages
2 087 396
Membres
103 534
dernier inscrit
Kalamymustapha