You are on page 1of 3

DESAFÍO: CUADRADOS E INVERTIDOS

NELSON G. LOMBARDO

Resumen. Este desafío fue presentado por lwayar.

1. Desafío
El desafío se puede hallar en la dirección http://www.retronet.com.ar/?p=759.

2. Código en GNU/Octave 3.0.1

clear ;
function [ qd]= q u a n t i t y ( number )
qd =0;
n=number ;
while ( n!= 0 )
qd = qd +1;
n = f i x ( n/ 1 0 ) ;
endwhile
endfunction
function [ nm]= m i r r o r ( number , qd )
a=n=number ;
nm=0;
f o r c =1: qd
n=f i x ( a / 1 0 ^ ( qd−c ) ) ;
a=a−(n ∗ 1 0 ^ ( qd−c ) ) ;
nm= nm+ n ∗ ( 1 0 ^ ( c −1) ) ;
endfor
endfunction
mx=1000000;
q =0;
format bank ;
f o r c =10:mx
[ qda ]= q u a n t i t y ( c ) ;
[ b]= m i r r o r ( c , qda ) ;
bb=b ^ 2 ;
c c=c ^ 2 ;
[ qda ]= q u a n t i t y ( c c ) ;
[ qdb]= q u a n t i t y ( bb ) ;
i f ( qda==qdb )
[ v]= m i r r o r ( bb , qdb ) ;
i f ( c c==v )
p r i n t f ( " %d %d %d %d\n " , c , b , c ^ 2 , b ^ 2 ) ;
q=q +1;
endif
endif
endfor
p r i n t f ( " La c a n t i d a d de numeros e s %d . " , q ) ;

3. Código en Fortran f90 usando gfortran 4.3.2


El archivo cuainv.f90:
PROGRAM c u a i n v
USE p r e c
IMPLICIT NONE
INTEGER (KIND=8) , PARAMETER : : maxit = 1000000
INTEGER (KIND=8) : : c , q , qda , qdb , b , bb , cc , v
q = 0
DO 20 c = 1 0 , maxit , 1
qda = q u a n t i t y ( c )
b = m i r r o r ( c , qda )
bb = b ∗∗ 2
c c = c ∗∗ 2
qda = q u a n t i t y ( c c )

Date: 11/01/2011.

i
qdb = q u a n t i t y ( bb )
IF ( qda .EQ. qdb ) THEN
v = m i r r o r ( bb , qdb )
IF ( c c .EQ. v ) THEN
WRITE( ∗ , ∗ ) ’ ’ , c , ’ ’ , b , ’ ’ , c c , ’ ’ , bb
q = q + 1
END IF
END IF
20 CONTINUE
WRITE ( ∗ , ∗ ) ’ La c a n t i d a d de numeros son ’ , q
END PROGRAM

El archivo prec.f90:
MODULE p r e c
CONTAINS
FUNCTION q u a n t i t y (number)
IMPLICIT NONE
INTEGER (KIND=8) : : number, q u a n t i t y , qd , n
qd = 0
n = number
DO
qd = qd + 1
n = n / 10
IF ( n .EQ. 0 ) THEN
q u a n t i t y = qd
EXIT
END IF
END DO
END FUNCTION q u a n t i t y
FUNCTION m i r r o r (number, qd )
IMPLICIT NONE
INTEGER (KIND=8) : : m i r r o r , number, qd , a , n , nm, c
a = number
n = number
nm = 0
DO 20 c = 1 , qd , 1
n = a / ( 1 0 ∗ ∗ ( qd−c ) )
a = a − ( n ∗ ( 1 0 ∗ ∗ ( qd−c ) ) )
nm = nm + n ∗ ( 1 0 ∗ ∗ ( c −1) )
20 END DO
m i r r o r = nm
END FUNCTION m i r r o r
END MODULE p r e c

El archivo makefile:
BIN = c u a i n v
CODE = p r e c . f 9 0 c u a i n v . f 9 0

all :
g f o r t r a n −combine $ {CODE} −o $ {BIN}
clean :
rm −f ∗ . mod $ {BIN}

4. Información de mi máquina
Debian 5.0.1
Laptop F506LA Compaq. 512Mb. 2GHz.
n e l s o n @ n e l s o n −l a p t o p : ~ $ uname −− a l l
Linux n e l s o n −l a p t o p 2.6.26 −2 −686 #1 SMP Sat Dec 26 0 9 : 0 1 : 5 1 UTC 2009 i 6 8 6 GNU/ Linux
n e l s o n @ n e l s o n −l a p t o p : ~ $ cat / p r o c / c p u i n f o
processor : 0
vendor_id : AuthenticAMD
cpu f a m i l y : 15
model : 76
model name : AMD Turion (tm) 64 Mobile Technology MK−36
stepping : 2
cpu MHz : 2000.000
cache s i z e : 512 KB
fdiv_bug : no
hlt_bug : no

ii
f00f_bug : no
coma_bug : no
fpu : yes
fpu_exception : yes
cpuid l e v e l : 1
wp : yes
flags : fpu vme de p s e t s c msr pae mce cx8 a p i c s e p mtrr pge mca cmov pat
p s e 3 6 c l f l u s h mmx f x s r s s e s s e 2 s y s c a l l nx mmxext f x s r _ o p t r d t s c p lm 3 dnowext 3
dnow up p n i cx16 lahf_lm svm e x t a p i c c r 8 _ l e g a c y
bogomips : 4022.27
clflush size : 64
power management : t s f i d v i d t t p tm s t c

5. Benchmark
La verdad no tiene mucho sentido esta sección en este caso...
El programa escrito en GNU/Octave tardo unos 21 minutos hasta darme el resultado final.
El programa escrito en fortran 90 y compilado con gfortran tardo 4 segundos en darme el resultado.
Ahora entienden porque les digo que no hay comparación!

6. Licencia
1
Los programas estan licensiados bajo la GPL v3 o superior según sea el caso. Siempre manteniendo mi libertad y
la suya como pilar fundamental para la transmición del conocimiento.

E-mail address: nelson.lombardo@gmail.com


URL: http://etech-nelson.blogspot.com/

1http://www.gnu.org/licenses/gpl.html

iii

You might also like