IPB

Bienvenue invité ( Connexion | Inscription )

> Nombre d'Armstrong En Python et/ou C(++)
Options
alfranz
posté 30 Mar 2023, 09:33
Message #1


Nouveau Membre


Groupe : Membres
Messages : 4
Inscrit : 27 Mar 2023
Membre no 217 569



J'ai besoin d'imprimer tous les nombres armstrong entre 1 et 10000. Mon problème est que lorsque j'exécute mon programme et que j'atteins 150, il ne fait rien.

Code
(1^3) + ((5^3)-1) + (0^3)


au lieu de

Code
(1^3) + (5^3) + (0^3).


Est-ce un bug du compilateur ? Est-il nécessaire de réinstaller mon compilateur ? J'utilise actuellement des blocs de code.

Code
#include <iostream>
#include <math.h>

using namespace std;

int main()
{
    for(int i = 0;i <= 10000;++i)
    {
        int r = i;
        int dig = 0;
        while(r != 0)
        {
            dig++;
            r /= 10;
        }
        int n = i, sum = 0;
        while(n != 0)
        {
            int d = n % 10;
            sum += pow(d, dig);
            n /= 10;
        }
        if(sum == i)
            cout << i << ' ';
    }
    cout << "\n\n\n";
    return 0;
}


En conséquence, il n'imprime pas 153 (un nombre d'Armstrong), car la somme est de 152. Je ne sais pas si d'autres nombres effectuent la même chose. Mais j'ai vérifié jusqu'à 200 en utilisant cette source et il n'y a aucun problème avec les autres chiffres sauf ceux de la zone 150-160.

Ce message a été modifié par Phil J. Fry - 31 Mar 2023, 12:31.
Raison de l'édition : Titre
Go to the top of the page
 
+Quote Post
 
Start new topic
Réponse(s)
Jaypee
posté 6 Jul 2023, 21:05
Message #2


Macbidouilleur d'Or !
*****

Groupe : Membres
Messages : 2 486
Inscrit : 29 Aug 2002
Membre no 3 340



Je sais que ça n'aide pas vraiment... je déterre un sujet et je change le langage...

En APL, on peut décoder un nombre en un vecteur de ses chiffres.
Code
      10 10 10 10 10⊤153
0 0 1 5 3


On peut prendre la puissance 3 d'un vecteur, ce qui produit le vecteur de la puissance 3 de chaque élément.
Code
      (10 10 10 10 10⊤153)*3
0 0 1 125 27


On peut sommer les éléments d'un vecteur par une réduction par l'addition :
Code
       +/(10 10 10 10 10⊤153)*3
153


On peut comparer ce résultat au nombre lui-même
Code
      153 = +/(10 10 10 10 10⊤153)*3
1


On peut transformer cette expression en fonction lambda (sans nom) en plaçant des accolades autour et en remplaçant l'argument par omega
Code
      {⍵ = +/(10 10 10 10 10⊤⍵)*3}
{⍵=+/(10 10 10 10 10⊤⍵)*3}


On peut la nommer: armstrong(int) -> bool
Code
      armstrong ← {⍵ = +/(10 10 10 10 10⊤⍵)*3}


On peut distribuer la fonction avec un opérateur "chaque" (symbolisé par des trémas), à chacun des arguments de droite
Code
       armstrong ¨ 1 2 3
1 0 0


On peut utiliser ce masque booléen pour filtrer un vecteur de même taille. Donc seul 1 est un nombre d'Armstrong dans le vecteur de 1 à 3
Code
       (armstrong ¨ 1 2 3)/1 2 3
1


On peut générer un vecteur d'indices avec l'opérateur iota:
Code
(armstrong ¨ ⍳3)/ ⍳3
1


On transforme l'expression en fonction:
Code
{(armstrong ¨ ⍳⍵)/ ⍳⍵}
{(armstrong¨⍳⍵)/⍳⍵}


Et finalement, l'appliquer jusqu'à la limite demandée:
Code
{(armstrong ¨ ⍳⍵)/ ⍳⍵} 10000
1 153 370 371 407


Note : Les nombres à 4 chiffres trouvés par le javascript ne sont pas des nombres d'Armstrong

J-P

Ce message a été modifié par Jaypee - 7 Jul 2023, 05:38.
Go to the top of the page
 
+Quote Post

Les messages de ce sujet


Reply to this topicStart new topic
1 utilisateur(s) sur ce sujet (1 invité(s) et 0 utilisateur(s) anonyme(s))
0 membre(s) :

 



Nous sommes le : 1st August 2025 - 16:56