BLOGOVIC.com

Borde izquierda
Borde izquierda
RSS 2.0 Últimos comentarios
Borde izquierda
Borde izquierda
Archivo
Valid XHTML 1.0 Transitional
Valid CSS
Valid RSS

¿Sabes lo que es un número armstrong?
  martes, 13/11/2007 por vic en programando

Hasta hace un par de días yo tampoco lo sabía, pero ahora hasta he creado un programita en c que calcula números armstrong. Un número con n dígitos es un número armstrong si la suma de las potencias n-ésimas de los dígitos que lo forman es igual al propio número. Algunos ejemplos:
153=13+53+33
370=33+73+03
371=33+73+13
407=43+03+73

O lo que viene siendo lo mismo en un lenguaje coloquial. Son números armstrong todos aquellos que al elevar cada uno de los números que lo componen al número total de dígitos que contiene, la suma de dichos resultados es igual al propio número.

#include <stdio.h>
#include <math.h>

const NUM_MAX=999999;

//La función elevar devuleve el resultado de un número que recibe(base) elevado al exponente que recibe(exp), en realidad es lo mismo que pow, pero no me funcionabal en mi ordenador, por lo tanto, tienes que borrarla y sustituir casi al final del programa la línea en la que uso la función elevar por la que está al lado.
long elevar(int base,int exp)
{
  long res;
  int i;
  res=1;
  if (base==1)
    res=1;
  else
    for(i=1;i<=exp;i++)
      res=res*base;
  return res;
}

int main(int argc, char *argv[])
{
  int num; //Variable para hacer cálculos.
  long int i; //Variable contador, para bulces y cálculos.
  int cont; //Variable para guardar el número de cifras del número introducido.
  int resto;
  long int resultado; //Variable para hacer cálculos. En ella se guarda el resultado de elevar todas las cifras del número a un exponente y compararlas con el número introducido.
  //Las siguientes variables son para guardar la cifra correspondiente del número para posteriormente hacer cálculos.
  int u; //unidades
  int d; //decenas
  int c; //centenas
  int um; //unidades de millar
  int dm; //decenas de millar
  int cm; //centenas de millar

  printf("** Cálculo de números armstrong menores de %li **\n",NUM_MAX);
  for(i=1;i<=NUM_MAX;i++)
  {
    //Se pasa el valor de i a la variable num para no cambiar el valor de i y hacer cálculos con num.
    //Se va comprobando el valor de num y guardando en cada una de las variables la cifra correspondiente. El % devuelve el resto de una operación.
    num=i;

    u=0;
    d=0;
    c=0;
    um=0;
    dm=0;
    cm=0;
    cont=0;
    while (num>0)
    {
      //Se obtienen las cifras en orden inverso. Primero unidades, luego decenas...
      resto=num%10; //Con esta operación obtenemos el resto de dividir por diez, que será siempre la última cifra.
      num=(num-resto)/10; //Quitamos la última cifra al número y actualizamos la variable num para obtener la siguiente cifra.
      cont++; //Aumentamos en uno el contador de cifras. Según este contador, guardamos la cifra en la variable correspondiente.
      if (cont==1) u=resto;
      else if(cont==2) d=resto;
      else if(cont==3) c=resto;
      else if(cont==4) um=resto;
      else if(cont==5) dm=resto;
      else if(cont==6) cm=resto;
      else num=0; //Nunca debería llegar aquí
    }

    //Ya tenemos el número descompuesto en sus cifras: u,d,c,um,dm,cm
    //Inicializamos resultado.
    resultado=0; //En resultado se guarda el resultado obtenido después de elevar cada número a sus exponentes.

    resultado=elevar(u,cont)+elevar(d,cont)+elevar(c,cont)+elevar(um,cont)+elevar(dm,cont)+elevar(cm,cont);
    //Se guarda en la variable el resultado de elevar cada cifra al exponente correspondiente para cada una de las cifras.
    //Se comprueba si el resultado es igual al número actual, puesto que i es igual, estamos ante un número armstrong.
    if (resultado==i)
      printf("El número %d es un número armstrong.\n",i);
  }
  return 0;
}

14 comentarios | 15399 clicks


También te puede interesar:


Comentarios

 #1tonio - martes, 13/11/2007 10:33

Ostias meu canto tempo libre tes!!!

Ben pero eu para facelo máis friki o metodo elevar fariao de forma recursiva... tirando 'al vuelo' e lembrando o aprendido fai anos e nunca máis usado penso que podería ser algoa así (ollo non o probei, como digo isto vai 'a lo loco')::

int evaluar(int base, int exp)
{
if (exp == 0) return 1;
else return base* elevar(base, exp-1);
}

Non sei visto así parece que pode funcionar, ben só era un apunte para darlle unha volta de rosca o asunto jeejeee

Que tempos aqueles na facu dandolle a recursividade en Haskell... buuuf que dores de cabeza!!!! ainda que saias cas neuronas a tope de caixa:-)

 #2vic - martes, 13/11/2007 11:20

Esto segurísimo que é moi mellorable, pero fíxeno onte en un par de horas porque o precisaba urxentemente un amigo de meu irmán e non lle saía... e aló fun eu recordando vellos tempos.:)

A función elevar incluso é prescindible, porque se pode usar a función pow de math.h, pero onte tiña problemas no linux cos includes, e a falta de tempo e mirar que pasaba, decidín facer a miña propia función para elevar. Sen dúbida, a túa de recursividade ten moita mellor pinta, optimizando e amortizando recursos:D

 #3tonio - martes, 13/11/2007 11:47

Non home eu só che puxen a función esa como digo para dar unha volta de rosca, só por iso...:-) se é mellorable ou non é o mesmo o importante e o que ti fixeches, ter a aptitude para poñerse a facer un programa sobre algo que che chama a atención;-)

Que usas para programar... algunha GUI estilo eclipse, ou o gedit por exemplo co gcc... eu fai moooito que non programo sobre gnu/linux ainda que levo un par de semanas mirando o proxecto -Mono- de M.Icaza para programar sobre C# e GTK; haber se encontro tempo e empezo a xogar eu tamén. Tamén teño ganas de reencontrarme con Java e quizais para iso sí ou usar o Eclipse que agora ten o apoio de SUN para facer del unha GUI de programación excelente según din.
Xa veremos...;-D

Saudos figura!!!!!!!

 #4tonio - martes, 13/11/2007 11:50

Por certo o amigo de teu irmán xa che pode pagar unhas estrellas galicia que menudo favor lle fixeche... jejeeee

 #5vic - martes, 13/11/2007 23:11

Non uso ningunha GUI, son máis de editor de textos. Probei o Eclipse, Aptana e Anjuta pero vexoos demasiado complexos, demasiadas opcións cando o único que busco é un resaltador de texto con algunha que outra opción. Gústame eso de ter o control sobre todo, aínda que faga perder tempo. Aínda que tamén pode ser que non me gusten porque non sei usalos... vai ti a saber.

Para C, no Ubuntu uso o gedit co gcc. Ten un resaltador decente, pero quizáis é demasiado sinxelo. En Windows gustame moito o PsPad, e freeware e non precisa instalación, un simple copia e pega e xa rula. Ten resaltador e as típicas funcións que se precisan ao programar. Moi completo, incluso ten un ftp, que eu non uso, pero interesante. O PsPad, incluso rula moi ben emulado co Wine, é o que uso para programar asp, xa que en Linux é o único resaltador de asp que atopei.

Se algún día me poño en serio co PHP, que espero sexa pronto, seguro que probarei o Eclipse, aínda que me ten moi boa pinta o Aptana, que está pensado para PHP, Ajax e CSS.

 #6tonio - viernes, 16/11/2007 13:03

Oe mira que bonito!!!
http://www.youtube.com/watch?v=8zRUyVTwdj0

Jejeee servir non sei se sirve para algo pero a min encantanme estas cousas!!! Vanse Volando!!!!!!!!!!!

 #7. edu - jueves, 22/11/2007 23:50

pues yo tengo un programa en c que calcula si un numero es armstrong o no mucho mas facil que el del comienzo........y eso es para probar que soy un teso!!!

#include <stdio.h>
#include <conio.h>

int armstrong (int x);
void main (void)
{
int n, r;
clrscr();
printf ("ingrese un valor");
scanf ("%d", &n);
r=armstrong(n),
if (r==1)
{
printf ("El numero ingresado es armstrong");
}
else
{
printf ("El numero ingresado no es armstrong");
}
getch();
}
int armstrong (int x)
{
int a, b, c;
if (x>99 && x<1000)
{
a=((x/10/10)%10);
b=((x/10)%10);
c=(x%10);
if (((a*a*a) +(b*b*b)+ (c*c*c))==x)
{
return(1);
}
else
{
return(0);
}
}
else
}
printf ("Error");
}
}

lo anterior es para un numero de 3 cifras, si lo desea de mas cifras, solo cambie los valores correspondientes para "a, b, c", y listo........ mucha suerte a todos, espero que les sirva el programa

 #8. yo aw - viernes, 02/05/2008 16:34

hola! soy un ignorante de programacion y he intentado usar estos codigos en Visual web developer es para mi examen de programacion!! no se si me podrian ayudar en algo os agradeceria.

 #9. tu aw - jueves, 08/05/2008 18:38

hola! el que habló ateriormente es un ingnorante de programación y ha intentado usar esos códigos en web developer para su examen de programacion, el mismo examen que debo yo desarrollar, pero al menos yo al no entenderlo no lo intento.
Otro pedido mas de que el que entre a este foro y tenga una idea de como desarrollar este problema, por favor nos dé la mano, se le agradecerá de todo corazón.

 #10sofia - jueves, 26/06/2008 00:00

no dicew un soto es cualquiera esta pag.

 #11. CHRISTOPHER - viernes, 05/09/2008 18:30

yo tome el programa de edu q puso ahi y le agrege un for para q probara todos los numeros y solo despliega los 4 del principio, si bien no me quedo totalmente claro es q solo existen numeros armstrong de 3 cifras???

gracias

 #12. Abel - lunes, 06/10/2008 07:26

ps yo acabo de hacer un programa en java, que muestra los 10 primeros numeros Armstrong, teniendo en cuenta que:

"Un número con n dígitos es un número armstrong si la suma de las potencias n-ésimas de los dígitos que lo forman es igual al propio número"

Funciona para cualquier numero, pues lo que la funcion hace primero es contar la cantidad de digitos que tiene el numero para luego poder sumar cada digito elevado a la cantidad de digitos.

public class Armstrong {
public static void main (String[] args){
int i, cantidad=0, total=10;
for (i=10;cantidad<total;i++){
if(esArmstrong(i)){
System.out.print(i+", ");
cantidad++;
}
}
}
static boolean esArmstrong(int numero){
int i, suma=0,numeroOtraVez=numero;
for(i=0;numeroOtraVez!=0;i++){
numeroOtraVez/=10;
}
numeroOtraVez=numero;
for(;numeroOtraVez!=0;){
suma+=Math.pow(numeroOtraVez%10,i);
numeroOtraVez/=10;
}
if (suma==numero)
return true;
else
return false;
}
}

 #13. Alberto - jueves, 27/11/2008 07:44

Hola, yo lo resolvi así.
Espero que este bien.........

public class Amstrong
{
public static void main(String[] args)
{
int dato = 407;
String aux = String.valueOf(dato);
int suma=0;

int array[] = new int [aux.length()]; //tamanio de nuestro arreglo

for (int i = 0; i<aux.length(); i++) {
array[i] = Integer.parseInt(String.valueOf(aux.charAt(i)));
System.out.print(array[i] + "::::::");
System.out.println(Math.pow(array[i],aux.length()));
suma += Math.pow(array[i],aux.length());
}

if (suma == dato)
{System.out.println("Si es un número Amstrong la suma es de " + suma);
}
else
{
System.out.println("No lo es porque la suma es " + suma);
}
}
}

Me quedo asi

4::::::64.0
0::::::0.0
7::::::343.0
Si es un número Amstrong la suma es de 407










 #14. Alberto - jueves, 27/11/2008 08:04

Je!, se me olvidó decirles que pueden cambiarle el dato por otro número. Automáticamente esta diseñado para calcular el tamaño del numero ingresado.



Comentarios cerrados



El contenido de esta web está bajo una licencia Creative Commons. Lo puedes copiar, modificar y distribuír libremente, con el único requisito de mencionar su origen.

entrar
Tiempo de carga de la página: 0.156 seg.