stringtranslate.com

Número narcisista

En teoría de números , un número narcisista [1] [2] (también conocido como invariante digital pluscuamperfecto ( PPDI ), [3] un número de Armstrong [4] (en honor a Michael F. Armstrong) [5] o un número plusperfecto ) [6] en una base numérica dada es un número que es la suma de sus propios dígitos, cada uno elevado a la potencia del número de dígitos.

Definición

Sea un número natural. Definimos la función narcisista de la base como la siguiente:

¿Dónde está el número de dígitos del número en base , y

es el valor de cada dígito del número. Un número natural es un número narcisista si es un punto fijo para , lo que ocurre si . Los números naturales son números narcisistas triviales para todos , todos los demás números narcisistas son números narcisistas no triviales .

Por ejemplo, el número 153 en base es un número narcisista, porque y .

Un número natural es un número narcisista sociable si es un punto periódico para , donde para un entero positivo (aquí es el iterador th de ), y forma un ciclo de período . Un número narcisista es un número narcisista sociable con , y un número narcisista amistoso es un número narcisista sociable con .

Todos los números naturales son puntos preperiódicos para , independientemente de la base. Esto se debe a que para cualquier recuento de dígitos dado , el valor mínimo posible de es , el valor máximo posible de es , y el valor de la función narcisista es . Por lo tanto, cualquier número narcisista debe satisfacer la desigualdad . Multiplicando todos los lados por , obtenemos , o equivalentemente, . Como , esto significa que habrá un valor máximo donde , debido a la naturaleza exponencial de y la linealidad de . Más allá de este valor , siempre. Por lo tanto, hay un número finito de números narcisistas, y se garantiza que cualquier número natural alcance un punto periódico o un punto fijo menor que , lo que lo convierte en un punto preperiódico. Establecerlo igual a 10 muestra que el número narcisista más grande en base 10 debe ser menor que . [1]

El número de iteraciones necesarias para alcanzar un punto fijo es la persistencia de la función narcisista de , y es indefinido si nunca alcanza un punto fijo.

Una base tiene al menos un número narcisista de dos dígitos si y solo si no es primo, y el número de números narcisistas de dos dígitos en la base es igual a , donde es el número de divisores positivos de .

Toda base que no sea múltiplo de nueve tiene al menos un número narcisista de tres dígitos. Las bases que no lo son son

2, 72, 90, 108, 153, 270, 423, 450, 531, 558, 630, 648, 738, 1044, 1098, 1125, 1224, 1242, 1287, 1440, 1503, 1566, 1611, 1620, 1800, 1935, ... (secuencia A248970 en la OEIS )

Sólo hay 88 números narcisistas en base 10, de los cuales el más grande es

115.132.219.018.763.992.565.095.597.973.971.522.401

con 39 dígitos. [1]

Números narcisistas y ciclos deFbpara específicob

Todos los números están representados en base . '#' es la longitud de cada secuencia finita conocida.

Extensión a números enteros negativos

Los números narcisistas se pueden extender a los números enteros negativos mediante el uso de una representación de dígitos con signo para representar cada número entero.

Ejemplo de programación

Pitón

El siguiente ejemplo implementa la función narcisista descrita en la definición anterior para buscar funciones y ciclos narcisistas en Python .

def  ppdif ( x ,  b ):  y  =  x  recuento_de_dígitos  =  0  mientras  y  >  0 :  recuento_de_dígitos  =  recuento_de_dígitos  +  1  y  =  y  //  b  total  =  0  mientras  x  >  0 :  total  =  total  +  pow ( x  %  b ,  recuento_de_dígitos )  x  =  x  //  b  devolver  totaldef  ppdif_cycle ( x ,  b ) :  visto  =  []  mientras x  no  está  en  visto :  visto.append ( x ) x = ppdif ( x , b ) ciclo = [ ] mientras x no está en ciclo : ciclo.append ( x ) x = ppdif ( x , b ) devolver ciclo                   

El siguiente programa Python determina si el número entero ingresado es un número Narcisista / Armstrong o no.

def  n° de dígitos ( num ):  i  =  0  mientras  num  >  0 :  num  //=  10  i += 1 devuelvo  yodef  suma_requerida ( num ):  i  =  no_de_dígitos ( num )  s  =  0  mientras  num  >  0 :  dígito  =  num  %  10  num  //=  10  s  +=  pow ( dígito ,  i )  volver  snum  =  int ( input ( "Ingrese el número:" )) s  =  required_sum ( num ) si  s  ==  num :  print ( "Número Armstrong" ) de lo contrario :  print ( "No es un número Armstrong" )

Java

El siguiente programa Java determina si el número entero ingresado es un número Narcisista / Armstrong o no.

importar java.util.Scanner ; clase pública ArmstrongNumber {    public static void main ( String [] args ) { Scanner in = new Scanner ( System.in ) ; System.out.println ( " Ingrese un entero positivo : " ) ; int number = in.nextInt ( ) ;                if ( isArmstrongNumber ( número )) { System . println ( número + " es un número de Armstrong." ); } else { System . println ( número + " no es un número de Armstrong." ) ; } }              público estático booleano isArmstrongNumber ( int número ) { int suma = 0 ; String numberString = Integer . toString ( número ); int numberOfDigits = numberString . length ();                  para ( int i = 0 ; i < numeroDeDígitos ; i ++ ) { int dígito = Carácter . obtenerValorNumérico ( numberString . charAt ( i )); suma += Math . pow ( dígito , numeroDeDígitos ); }                   devolver suma == numero ; } }    

DO#

El siguiente programa C# determina si el número entero ingresado es un número Narcisista/Armstrong o no.

usando Sistema ; clase pública Programa { public static void Main () { Console . WriteLine ( "Ingrese el número:" ); int valor = int . Parse ( Console . ReadLine ());             if ( valor == RequiredSum ( valor )) { Console . WriteLine ( "Número de Armstrong" ); } else { Console . WriteLine ( "No es un número de Armstrong" ); } }             privado estático int CountDigits ( int num ) { int i = 0 ; para (; num > 0 ; ++ i ) num /= 10 ;                   devuelve i ; }    privado estático int RequiredSum ( int num ) { int count = CountDigits ( num );          int suma = 0 ; mientras ( num > 0 ) { suma += ( int ) Math . Pow ( num % 10 , count ); num /= 10 ; }                   devolver suma ; } }  

do

El siguiente programa en C determina si el número entero ingresado es un número Narcisista/Armstrong o no.

#include <stdio.h> #include <stdlib.h> #include <stdbool.h>   int obtenerNumeroDeDígitos ( int n ); bool esNumeroArmstrong ( int candidato );    int main () { int userNumber = 0 ; printf ( "Ingrese un número para verificar si es un número Armstrong: " ); scanf ( "%d" , & userNumber ); printf ( "¿Es %d un número Armstrong?: %s \n " , userNumber , isArmstrongNumber ( userNumber ) ? "true" : "false" ); return 0 ; }                 bool isArmstrongNumber ( int candidato ) { int numeroDeDígitos = obtenerNumeroDeDígitos ( candidato ); int suma = 0 ; para ( int i = candidato ; i != 0 ; i /= 10 ) { int num = i % 10 ; int n = 1 ; para ( int j = 0 ; j < numeroDeDígitos ; j ++ ) { n *= num ; } suma += n ; } return suma == candidato ; }                                                   int obtenerNumeroDeDigits ( int n ) { int suma = 0 ; mientras ( n != 0 ) { n /= 10 ; ++ suma ; } devolver suma ; }                  

C++

El siguiente programa C++ determina si el entero ingresado es un número narcisista/Armstrong o no.

#include <iostream> #include <cmath> bool isArmstrong ( int n ) { //La función floor es redundante porque log10(n) + 1 siempre será un entero cuando n es positivo. Simplemente usar static_cast<int>(log10(n)) + 1 sería suficiente. //int digits = floor(log10(n) + 1); //fórmula matemática para encontrar la cantidad de dígitos en un número con cualquier base int suma = 0 ; si ( n >= 0 ) { int digits = static_cast < int > ( log10 ( n )) + 1 ; para ( int tmp = n ; tmp ; tmp /= 10 ) suma += pow ( tmp % 10 , digits ); } devolver suma == n ; } int main () { int n = 407 ; if ( isArmstrong ( n )) std :: cout << n << " es un número narcisista \n " ; else std :: cout << n << " no es un número narcisista \n " ; }                                                        

Rubí

El siguiente programa Ruby determina si el número entero ingresado es un número Narcisista / Armstrong o no.

def narcisista? ( valor ) #1^3 + 5^3 + 3^3 = 1 + 125 + 27 = 153 nvalue = [] nnum = valor . to_s nnum . each_char hacer | num | nvalue << num . to_i fin suma = 0 i = 0 mientras suma <= valor nsum = 0 nvalue . each_with_index hacer | num , idx | nsum += num ** i fin si nsum == valor devuelve verdadero de lo contrario i += 1 suma += nsum fin fin devuelve falso fin                                                     

JavaScript

El siguiente programa JavaScript determina si el número entero ingresado es un número Narcisista / Armstrong o no.

función narcisista ( numero ) { const numString = number . toString (); const numDigits = numString . length ; deja suma = 0 ;               para ( sea dígito de numString ) { suma += Math . pow ( parseInt ( dígito ), numDigits ); }           devolver suma === numero ; }   

Óxido

El siguiente programa Rust imprime todos los números Narcissistic / Armstrong del 0 al 100 millones en base 10.

fn  is_armstrong_number ( num : u64 ) -  > bool  { let dígitos = num.to_string ( ) ; dígitos.chars ( ) . map ( | x | ( x como u64 - 0x30 ) .pow ( dígitos.len ( ) como u32 ) ) .suma :: <u64> ( ) == num }                 fn  main () { ( 0 .. 100_000_000 ). for_each ( | n | { if es_numero_armstrong ( n ) { println! ( "{n}" ) } }) }         

Véase también

Referencias

  1. ^ abc Weisstein, Eric W. "Número narcisista". MathWorld .
  2. ^ Invariantes digitales perfectas y pluscuamperfectas Archivado el 10 de octubre de 2007 en Wayback Machine por Scott Moore
  3. ^ Números de PPDI (Armstrong) de Harvey Heinz
  4. ^ Números de Armstrong por Dik T. Winter
  5. ^ El blog de Lionel Deimel
  6. ^ (secuencia A005188 en la OEIS )

Enlaces externos