Archivo

Archivo para Diciembre, 2009

Ahorrando energía… desactivando cores

Martes, 29 de Diciembre de 2009 Gaspar Fernández Sin comentarios

En los tiempos que corren, muchas personas (no es mi caso) tienen CPUs de doble núcleo (o de más de dos), o con varios procesadores. Además, tenemos que tener en cuenta que todo el tiempo (seguro) que un ordenador personal no está utilizando los dos núcleos, de forma considerable todo el tiempo; pero siempre está trabajando, aunque no esté haciendo nada (lo cual causa un gasto de energía y un calentamiento del equipo en general), si lo sumamos a que muchos usuarios son de dispositivos portátiles y que la batería de éstos no es eterna (mi batería dura ya unos 15 minutos); tendremos en algún momento la necesidad de desactivar un núcleo en algún momento determinado (aunque sólo sea para estirar la batería unos 10 minutos más).

Desactivando cores 1Tal y como vi en Muy Linux, hace unos días hay una forma sencilla de desactivar núcleos o procesadores.

A menudo, mantengo en ejecución un monitor de los núcleos, que indica u uso y velocidad (este que se ve en la ilusración es el plasmoid Coremoid). Vemos cómo los dos núcleos están en uso. Ahora, como root ejecutamos:

1
echo 0 > /sys/devices/system/cpu/cpu1/online

Lo siento, no es posible hacerlo con la CPU0, un poco de sentido común, si desactivamos los dos procesadores, mejor nos compramos un ábaco y nos quitamos de ordenadores.
Pero un detalle, podremos observar que incluso de /proc/cpuinfo ha desaparecido la CPU 1:

# cat /proc/cpuinfo
processor : 0
vendor_id : GenuineIntel
cpu family : 6
model : 15
model name : Intel(R) Core(TM)2 Duo CPU T5250 @ 1.50GHz
stepping : 13
cpu MHz : 1000.000
cache size : 2048 KB
physical id : 0
siblings : 1
core id : 0
cpu cores : 1
apicid : 0
initial apicid : 0
fdiv_bug : no
hlt_bug : no
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid level : 10
wp : yes
flags : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush dts acpi mmx fxsr sse sse2 ss ht tm pbe nx lm constant_tsc up arch_perfmon pebs bts pni dtes64 monitor ds_cpl est tm2 ssse3 cx16 xtpr pdcm lahf_lm
bogomips : 2993.32
clflush size : 64
power management:

Ahora damos un paso más, aunque éste ya es un viejo conocido de muchos:

1
2
3
# modprobe cpufreq_userspace
# cpufreq-set -g userspace
# cpufreq-set -f 1G

y podremos modificar la frecuencia de la CPU, podemos, por ejemplo ponerla al mínimo cuando sepamos que no vamos a utilizarla en exceso, y darle velocidad cuando vayamos a hacer algo pesado (en realidad existe un governor (eso de userspace) que se llama ondemand que modifica la velocidad de la CPU dependiendo del uso que le demos, aunque a veces llega a modificar la velocidad con demasiada frecuencia y personalmente no me gusta marear tanto la CPU.
Para consultar las velocidades disponibles de CPU podemos ejecutar:

1
# cpufreq-info

y nos dirá lo que necesitamos saber.

Un apunte más, para volver a activar una CPU, basta con hacer:

1
echo 1 > /sys/devices/system/cpu/cpu1/online

¡ y listo ! con esto, seguro que más de uno ya tiene ideas para posibles scripts que permitan ahorrar algo de energía, o darle un respiro térmico a su equipo.

Categories: General Tags:

Se corta Internet a las 19:12, 15 UTC+1

Lunes, 28 de Diciembre de 2009 Gaspar Fernández Sin comentarios

Parece ser que se ha descubierto que el chip que controla el tiempo en muchos de los servidores de Internet tiene un bug en el algoritmo que lo realiza, puesto que los cálculos los hicieron con Excel 2007, y a nadie le dio por repasar las cuentas. En definitiva, cuando pasemos al segundo 16 parecerá que el día ha tenido casi 28h, y devolverán una hora incorrecta; los servidores que monitorizan las peticiones en Internet deberán almacenar una hora correcta, pero el sistema no será capaz de devolverla… en fin, un caos… a quién se le ocurriría.

Si pensáis que no, a ver en UTC la hora sería las 18:12, 15 y si pasamos eso a segundos, nos devuelve 65535, normalmente el chip que se encarga de la fecha y la hora descompone los segundos en horas, minutos y segundos, calcula las centésimas y demás… pero luego recompone el valor para pasar al siguiente segundo, y ahí es cuando la lia…

Esperemos, al menos que desconecten los servidores durante ese periodo de tiempo y luego los vuelvan a encender… así no habrá problema :)

Categories: General Tags:

¡ Feliz navidad !

Viernes, 25 de Diciembre de 2009 Gaspar Fernández 2 comentarios

papa-noel-chofFeliz navidad !! Desarrolladores, desarrolladoras, aspirantes a serlo, apasionad@s de la tecnología, lectores nuevos y habituales a este pequeño agujerito de mi mundo.

Pero… qué hacéis leyendo esto !! ¿ No deberíais estar pasándolo bien en estas fiestas ? Hay que ver, siempre enganchad@s al ordenador :)

Un abrazo para tod@s !!

Categories: General Tags:

Firefox 3.5 es el navegador más usado

Martes, 22 de Diciembre de 2009 Gaspar Fernández 4 comentarios

Firefox 3.5Para ser la penúltima semana del año, vienen buenas noticias para este mundo, y para los diseñadores/maquetadores y programadores web, y es que al menos un navegador que soporta casi todos los estándares web es el más usado por los usuarios.

También es verdad que si sumamos todos los usuarios de Internet Explorer, y que seguro que muchos usuarios están en proceso de migración de IE7 a IE8, además de los muchos usuarios a los que como les va bien IE6, no piensan cambiar ni actualizarse, Internet Explorer gana. Pero es un buen dato, y una noticia positiva y alentadora.

Fuente: http://gs.statcounter.com/#browser_version-ww-weekly-200827-200951-line

Andanzas en Facebook: Publicando en los perfiles II

Sábado, 19 de Diciembre de 2009 Gaspar Fernández 6 comentarios

Hace unos meses hice un post sobre la publicación en los perfiles del usuario en Facebook desde nuestras aplicaciones. Bien, desde el día de hoy (20/12/2009) han cambiado los métodos.

Llevan amenazando ya un tiempo, pero hasta ayer no les hice caso, y es que los nuevos métodos (aunque prometen unificar todo el sistema de publicaciones de Facebook, autopublicaciones en perfiles, para los amigos, metadatos y lectura desde nuestras aplicaciones (más info. aquí), tienen detalles que no a todo el mundo le gustan. Como por ejemplo las publicaciones multi línea, el uso de palabras clave {*actor*}, {*mensaje*}, {*palabraquemeacabodeinventar*} dentro de todos los campos de publicación y la limitación de los action links a 1 !!!!!!! :(

Lo que sí han hecho es simplificarlo todo: no tenemos que crear un template para luego utilizarlo, y el hecho de que podamos definirlo todo por código y llamarlo cuando queramos, además, no tenemos límite de publicaciones distintas, ya que como las tenemos que crear cada vez que publiquemos, podemos hacer lo que queramos (antiguamente había un límite de 100 templates por usuario, suficientes, pero a lo mejor alguien necesitaba más).

Se potencia el uso de JSON (como los arrays en Javascript), y es que si es desde Javascript desde donde llamamos a la función, lo vamos a necesitar.

Aquí incluyo un fragmento de código para una publicación (he acompañado cadenas largas y palabras clave en todas partes para ver el comportamiento de Facebook con ellas, observar qué límites tenemos y demás):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
var actionlinks=[{"text":"Mi minuto filosófico","href":"http://apps.facebook.com/minutofilosofico/"},{"text":"Ésta frase en mi perfil!","href":"http://apps.facebook.com/minutofilosofico/?frase=1234"}]

var attachment = {'name': '{*actor*} No sé si funciona aquí, veamos si aparece un enlace, o también, en caso de un texto realmente largo qué pasa, porque lo mismo me pongo a escribir letras, y pasa como en el caption, que sólo sale un par de líneas, y me quedo con las ganas de que salga más texto, pero bueno, el caso es que tengo que probar tanto por el tutorial como por mis aplicaciones.',
          'properties':{0:{'text':'enlace 1',
                    'href':'http://www.totaki.com'},
                                   1:{'text':'enlace 2',
                    'href':'http://www.totaki.com'},
  },
          'description': 'Una descripcion \nlarga que incluye un enlace que \nno funciona bien: <a href="http://www.totaki.com/">con un enlace</a> y una <strong>negrita</strong> que<br/> tampoco funciona, porque Facebook ha limitado lo que puede salir en estos sitios; además, mi\n mensaje es lo suficientemente largo como para que aparezca el texto de Mostrar más. {*actor*} aquí no funciona',
          'href':'http://www.totaki.com',
          'caption': '{*actor*} está probando algunas cosillas, pero ya puestos vamos a probar un caption largo largo largo, para probar la capacidad de estos nuevos métodos que tiene Facebook para publicar en los perfiles de la gente. Tal vez el caption se corte, tal vez, muestre el texto de ver más, o tal vez el texto ni se publique por ser demasiado largo, veamos qué pasa.',
          'media':[{'type':'image',
                'src':'http://www.totaki.com/unafoto.jpg',
                'href':'http://www.totaki.com'},

],
                  };
Facebook.streamPublish('Texto para el usuario', attachment, actionlinks, null, 'Otra frase');

Nos aparece algo así:
Publicando en Facebook (tamaño completo)
En donde nos damos cuenta que:

  • Sólo caption acepta la palabra clave {*actor*} y según la documentación, sólo esa palabra clave
  • No se aceptan retornos de carro en description, sólo se aceptarán en name.
  • Nuestra publicación puede ser un enlace (pinchando en el nombre)
  • Description no acepta fbml, es texto plano, aunque resalta los enlaces

Más adelante, cuando publicamos, nos damos cuenta de que sólo se permite un action link (enlaces que acompañan a Comentar y Me gusta), en Facebook llevaban reduciendo los action links unos días para todas las publicaciones.

Aunque un detalle importante es la inclusión de las propiedades (properties), es un array que puede contener textos y enlaces que los acompañen, y se publican, he podido hacer una publicación con 12 propiedades sin problemas.

El código superior puede servir como plantilla para vuestras publicaciones.

Pero, ¿qué pasa si quiero incluir el nombre del usuario que publica en name o description? debemos recurrir a la API de Facebook, podríamos pensar que desde fbml podemos hacerlo, pero no lo permiten en estos nuevos métodos, por lo que tendremos que recurrir a un lenguaje de servidor como PHP; de la siguiente forma:

1
$yo = $facebook->api_client->users_getInfo($user_id, "uid, name, first_name");

$user_id tiene que estar previamente definida y ser la id del usuario actual (para ello, sólo hay que seguir el ejemplo que te da Facebook para crear una aplicación, copiado y pegado).
El dato que queremos, es decir el nombre, lo encontraremos en $yo[0]['first_name'], por lo que, en mitad del código fbjs anterior, si nos encontramos en un archivo PHP podemos hacer lo siguiente:

1
2
3
var attachment = {'name': '<? echo $yo[0]['first_name']; ?> sí que funciona aquí, veamos si aparece un enlace, o también, en caso de un texto realmente largo ...',
          'properties':{0:{'text':'enlace 1',
                    'href':'http://www.totaki.com'},

Adsense en Facebook II

Sábado, 19 de Diciembre de 2009 Gaspar Fernández Sin comentarios

Continuando con un post anterior (Google Adsense en Facebook); me quedaron unas cuantas cosas en el tintero; la primera de ellas preguntada en los comentarios:

¿He podido cobrar de Google Adsense tras la inclusión de la publicidad en aplicaciones de Facebook? Sí, normalmente y sin problema.

También he de decir que incluí cierta información descriptiva del frame como HTML, aunque no es visible, pero describe el motivo de la publicidad, y el motivo de que esté ahí.

Por otra parte también hay un fragmento de código Javascript que leí en algún lugar de la web (que ya no encuentro):

1
document=parent.document;

He de decir que: no hace nada, ya vemos en la siguiente captura de pantalla que en ese punto nos devuelve un Permiso Denegado:
Permiso denegado JS.

Por otra parte, dado el crecimiento en el consumo de las redes sociales, yo creo que Google no considerará que aparecer en Facebook (en este caso) rompa los TOS (no hay ninguna cláusula que lo indique), es más, será beneficioso para todos.

La base de un aprendizaje… ¿Escuela 2.0?

Jueves, 17 de Diciembre de 2009 Gaspar Fernández Sin comentarios

Hace unos días leí un artículo que, a ser sincero, me esperaba. Microsoft llega a un acuerdo con Educación para que las comunidades autónomas que quieran implanten en sus centros educativos el Sistema Operativo Windows, con un coste de 8€ / año / alumno.

Y ya lo decía mi padre, quien regala bien vende, y lo he comentado alguna vez, y es que esos alumnos, el día de mañana sólo conocerán ese Sistema Operativo,  y cuando compren un ordenador buscarán que lo tenga preinstalado, y si montan una empresa adquirirán licencias de un sistema Windows al precio que venga marcado, así como su mantenimiento, renovaciones de licencias… en fin, todo lo que una empresa como Microsoft puede permitirse, dejar de ganar unos millones de Euros hoy para recuperar algún billón el día de mañana.

Aunque por otra parte viene el diálogo de la independencia tecnológica. Si España sigue así, como lo viene haciendo, depende de una empresa de EEUU para todo el tema informático, invirtiendo millones en ese país cuando los podía invertir perfectamente en España dando muchísimos puestos de trabajo y con un coste total mucho menor, porque hay gente que no le han dicho que es lo mismo pulsar sobre Inicio/El icono de Windows/Un pie/Una K/cualquier otro logotipo de la esquina de la pantalla para ver los programas del sistema (porque en su colegio o instituto hicieron una copia de seguridad o compraron Windows).

Antes de que nadie me mate, quiero decir que veo positivo que los alumnos de un colegio utilicen Windows, pero hay que conocerlo todo, tanto en el terreno de las matemáticas, historia, física, como en la informática (un mundo que se está implantando);  por otra parte 8€ * 10 alumnos * 10 clases = 800€ / año y si por 320€ conseguimos un equipo informático, son 2 equipos nuevos al año en un centro. Ahora más que nunca hay que mirar el dinero, teniendo en cuenta que un sistema GNU/Linux es capaz de alargar un poco más la vida de un equipo informático (un ordenador con 9 años de antigüedad va a una velocidad aceptable), y también hay que tener en cuenta la variedad de software educativo que encontramos (KDEEdu, Edubuntu…), por no mencionar que en los tiempos que corren que todo está en la nube, y priman las aplicaciones web, en muchas ocasiones lo único que necesitamos es un Navegador de Internet (y a la mayoría de los mortales creo que les da igual comprar Windows, o no; aunque a muchos debemos ponerle la misma decoración de ventanas).

Aunque no todo son malas noticias, hay personas que aún tienen cabeza en este caos: En Extremadura usarán Linex, y esa es buena noticia

Club2020 de Vodafone… enviar SMS desde la consola

Miércoles, 16 de Diciembre de 2009 Gaspar Fernández Sin comentarios

club2020No vengo a hablaros de la empresa Vodafone, ni del concurso (que podéis entrar desde este enlace y no tenéis que ser de Vodafone). Es un concurso rasca y gana (aunque cada cierto tiempo hay concursos parecidos; en el que uno de los premios son SMS gratis.

Hasta ahí bien, el problema viene a la hora de gastar los SMS, y es que mientras entro en la web (todo hecho en flash), se carga la intro, me la salto, se carga la web, me identifico, pulso en enviar mensajes, escribo el número, el mensaje y envío echo unos 3 minutos, y para el SMS tardo menos desde el móvil.

He hecho un pequeño script para consola que lo hace todo solo, y además en unos 10 segundos (como mucho) está mandado el mensaje… esto también nos permitirá enviar muchos mensajes seguidos (y si queremos usarlo para felicitar las fiestas, nos vendrá genial).

Nota: Antes de postear el código, quiero decir una cosa (NO hago comprobación de las letras de los mensajes, que son algo menos de 160 caracteres), ni de los parámetros (explicados al final) devuelvo el texto de enviado y no enviado, aunque eso no significa que se haga de verdad (ya sabéis cómo andan los SMS incluso en este 2009); por otra parte, si Vodafone corta el servicio o introduce alguna modificación en la página… ¡mala suerte! se nos acabó esto, pero quise compartir este código (y tal vez podamos hacer más cosa en el futuro con él).

Nota 2: Requiere cURL (sin él habría sido una matanza de código)

Nota 3: No está muy comentado, pero si hay alguna duda, siempre tendremos los manuales de cURL, de bash, y los comentarios en este post :)

Ahí va:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
#!/bin/bash

MOVIL_USR={mi movil}
CLAVE_USR={mi clave club2020}

function strpos()
{
str=${1/$2*/}
if [[ -z "$1" ]]; then
cad1l=0
else
cad1l=`expr length "$1"`
fi

if [[ -z "$str" ]]; then
donde=0;
else
donde=`expr length "$str"`
fi
if (( $donde &lt; $cad1l )); then
echo $donde
else
echo -1
fi
}

echo "Identificándonse en el sistema..."
#Envio de datos
login="accion=login&amp;clave%5Fusr="$CLAVE_USR"&amp;movil%5Fusr="$MOVIL_USR
data=`curl -s -L -b cookies.txt -c cookies.txt "http://club2020.mi.vodafone.es/rascaygana/actuar.php?"$login`

# Usé esto para obtener los datos a mano hace un rato
#echo $data&gt;tmp
#data=`cat tmp`

# Almacenamos en un array  los datos que nos ha mandado la web
i=1
datos[${i}]=`echo $data | cut -d"&amp;" -f $i`;

while [[ -n ${datos[${i}]} ]]; do let i=$i+1; datos[$i]=`echo $data | cut -d"&amp;" -f $i`; done
#Recorremos el array para mirar las opciones recibidas
datosrecibidos=${#datos[*]}

for ((i=0;i&lt;$datosrecibidos;i++)); do
if (( `strpos ${datos[${i}]} =` &gt; -1 )); then
combo=${datos[${i}]}
clave=`echo $combo | cut -d"=" -f1`
valor=`echo $combo | cut -d"=" -f2`
if [[ $clave == "usuario" ]]; then
usuario=$valor;
elif [[ $clave == "nombre" ]]; then
nombre=$valor;
elif [[ $clave == "tarjetas" ]]; then
tarjetas=$valor;
elif [[ $clave == "mensajes" ]]; then
mensajes=$valor;
fi
fi
done

echo "Hola "$nombre" te quedan "$mensajes" mensajes y tienes "$tarjetas" por rascar"
mensaje=$2
destinatario=$1
echo "Enviando mensaje: "$mensaje" a "$destinatario"..."
postdata="accion=mandarSms&amp;mensaje="$mensaje"&amp;destinatario="$destinatario"&amp;firma="$usuario

#Envio de datos
result=`curl -s -L -b cookies.txt -c cookies.txt -d "$postdata" 'http://club2020.mi.vodafone.es/rascaygana/actuar.php'`

#echo $result &gt; tmp2
result="retorno"`cat tmp2`
i=1
resdata[${i}]=`echo $result | cut -d"&amp;" -f $i`;

while [[ -n ${resdata[${i}]} ]]; do let i=$i+1; resdata[$i]=`echo $result | cut -d"&amp;" -f $i`; done
#Recorremos el array para mirar las opciones recibidas
resdatarecibidos=${#resdata[*]}

for ((i=0;i&lt;$resdatarecibidos;i++)); do
if (( `strpos "${resdata[${i}]}" =` &gt; -1 )); then
combo=${resdata[${i}]}
clave=`echo $combo | cut -d"=" -f1`
valor=`echo $combo | cut -d"=" -f2`
if [[ $clave == "error" ]]; then
error=$valor;
elif [[ $clave == "mensajes" ]]; then
mensajes=$valor;
fi

fi

done

echo "Resultado de la operación: "$error" Quedan "$mensajes" mensajes"
echo "Cerrando sesión..."

#Envio de datos
curl -s -L -b cookies.txt -c cookies.txt 'http://club2020.mi.vodafone.es/rascaygana/actuar.php?accion=logout' &gt;/dev/null

Si guardamos este archivo como sms2020 y le damos permiso de ejecución, el primer parámetro es el móvil del destinatario, y el segundo el mensaje (entrecomilladlo si tiene espacios). Además, en la parte de arriba del archivo encontramos MOVIL_USR y CLAVE_USR, tendréis que poner vuestro número de móvil y vuestra clave del club2020 (para poder identificaros en el sistema).
Nota 4: Pude optimizar un poco el código, pero como había prisa y no sé lo que durará esto, no quise calentarme mucho el coco.
Nota 5: Para registrase: seguid este link (así me dais sms gratis a mí también, porque los demás premios nunca tocan).

Generador de números primos en C

Martes, 15 de Diciembre de 2009 Gaspar Fernández 2 comentarios

Un ejercicio de estos típicos de lenguaje C, es la generación de números primos y la comprobación de éstos. Ni que decir tiene que esta es sólo una de las 13.485,72 maneras (o más) de solucionar este problema. Y es más estamos complicando un poco la cosa, ya que sólo generaremos 10 números, que se almacenarán en un fichero binario, y a la siguiente vez que ejecutamos el programa, se leerá ese último número y seguiremos generando primos a partir de ahí:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <stdio.h>
#include <math.h>

// Comprobamos si un número es primo o no
int es_primo(int numero)
{
  int res=0;
  int divs=2;
  int mitad;
  if (numero>2)    // Si el número es mayor a 2, comprobamos si es primo.
    {
      /* Para ahorrar sólo comprobamos si un número es divisible hasta su mitad, ya que 7/2 = 3.xxx, 7/3=2.xxx, 7/4=0.xxx */
      /* cuando empezamos a obtener valores menores que 0, ya no encontraremos más divisores enteros */
      mitad=floor((double)numero/2);
      do
    {
      res=(numero%divs!=0);  /* ¿ El resto es 0 ? */
      //      printf("Divido %d entre %d. Resto %d. Res: %d\n", numero, divs, numero%divs, res);
      divs++;
    } while ((res!=0) && (divs<=mitad));
    }
  else if (numero==2) /* || (numero==1) */ /* ¿1 lo consideramos primo? */
    res=1;

  return res;
}

// Genera primos, los almacenaremos en p, empezamos desde _inicial_ y generamos _cantidad_ de números
void genera_primos (FILE *p, int inicial, int cantidad)
{
  int primos=0;
  int i=inicial;

  printf("INI:%d\n", inicial);
  while (primos<cantidad)
    {
      // Vamos comprobando uno a uno si es primo
      if (es_primo(i))
    {
      fwrite(&i, sizeof(int), 1, p);
      primos++;
      printf("%d\n", i);
    }
      i++;
    }
}


int main()
{
  FILE *p;
  int last_primo;
  // Abrimos el archivo para actualizar
  p = fopen("primos.dat", "a+b");
  if (p)
    {
      fseek(p, -sizeof(int), SEEK_END); /* Nos posicionamos para leer el último entero almacenado. */
      fread(&last_primo, sizeof(int), 1, p); /* Leemos el último */
      fseek(p, 0, SEEK_END); /* Nos posicionamos al final, para seguir escribiendo */
      printf("%d: ",last_primo);
      genera_primos(p, last_primo+1, 10);
      fclose(p);
    }
  else
    printf("No puedo abrir el archivo");
}

De aquí se pueden extraer ideas para hacer muchos ejercicios de este tipo. Eso sí, hay que recordar que para compilar tenemos que incluir la librería matemática. Por ejemplo, con gcc, en el caso de llamar al archivo primos.c, se compilaría:

gcc -lm -o primos primos.c

Capicúa recursivo en C

Viernes, 11 de Diciembre de 2009 Gaspar Fernández 8 comentarios
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
#include <stdio.h>
#include <stdlib.h>

int alreves(int n, int digitos)
{
  int resto, cocie;

  if (n<10)     // Si tenemos un número de dígitos menor a 2, devolvemos n
    return n;
  else
    {
      resto = n % 10;
      cocie = n / 10;
      return resto*digitos + alreves(cocie, digitos/10);
    }
}

int main()
{
  int num, rev;
  int digitos = 1;
  int tmp;
  printf("Dame un numero: ");
  scanf("%d", &num);
  // Hacemos un número 10^(numero de cifras-1) con esto alreves determinará el
  // número de cifras que tiene el número dado.
  tmp =num;
  while (tmp>=10)
    {
      tmp=tmp/10;
      digitos=digitos*10;
    }

  rev = alreves(num, digitos);

  // Capicúa o no ?
  if (rev==num)
    printf("\nEs capicua");
  else
    printf("\nNO es capicua");

  return 0;
}

Una posible solución al cálculo de números capicúa en C. La verdad es que tenemos muchas soluciones a este problema, ésta es una de ellas. El tema es, ¿acarreamos el número de cifras? podemos calcularlo a cada recursión (al principio de alreves()), o en lugar de este número tan raro (1 para 1 cifra, 10 para 2 cifras, 100 para 3 cifras…), poner un número del tipo 1, 2, 3… éste sería capaz de dar la vuelta a número más grandes.

En fin, sólo es una de las 10.000 posibles soluciones al problema :)

Categories: C/C++ Tags: , , ,

Visita otras webs de la red