1.Introducción La programación es una herramienta muy poderosa para resolver todo tipo de problemas, entre ellos los problemas matemáticos. En este artículo se muestra cómo se resuelven algoritmos básicos, como son las siguientes cuestiones: Si un número es par o impar. Si un número es primo. Si un número es múltiplo de otro, u dicho de forma, comprobar si un número es divisor de otro. Obtener los dígitos que componen un número en orden inverso. Obtener el inverso de un número. Comprobar si un número es o no capicúa. Comprobar el factorial de un número entero, tanto de forma iterativa como de forma recursiva. Comprobar el número de fibonacci de un número entero, tanto de forma iterativa como de forma recursiva. Para todos estos casos se da una breve explicación del algoritmo y finalmente se da el algoritmo en lenguaje C. 1 2.Comprobar si un número es par o impar Para comprobar si un número es par o impar simplemente tenemos que dividirlo entre dos y comprobar si el resto es 0. En caso positivo el número será par, y en caso negativo será impar. Ejemplo: número 20. Si dividimos 20 entre 2 el cociente es 10 y el resto es 0. Será par por lo tanto. Vamos a ver el programa en lenguaje C que dado un número entero pedido por teclado nos informa mediante un mensaje si es par o impar. #include <stdio.h> void main() { int a, resto; printf("dame el número\n"); scanf("%d",&a); resto=a%2; if (resto= = 0) { printf("El número es par\n"); } else { printf("El número es impar\n"); } } 2 3.Comprobar si un número es múltiplo de otro Para comprobar si un número es múltiplo de otro simplemente tenemos que hacer una división. Si el resto de la división es 0 el número mayor será múltiplo del menor, y a su vez el menor será divisor del primero. Vamos a ver el programa que pide dos números por pantalla y nos comprueba si el mayor es múltiplo del primero. #include <stdio.h> void main() { int a,b; printf("dame un entero\n"); scanf("%",&a); printf("dame un entero\n"); scanf("%",&b); //se comprueba cuál es el número mayor y cuál es el menor if (a>b) { Max=a; Min=b; } else { Max=b; Min=a; } resto=max%min; if (resto= = 0) { printf("El número %d es múltiplo de %d\n",max,min); } else { printf("El número %d no es múltiplo de %d\n",max,min); } } 3 4.Comprobar si un número es primo Un número primo es aquel que sólo es divisible por si mismo y por la unidad, es decir, desde el número dos hasta el número – 1 no tiene ningún divisor. Ejemplo: Numero 17. Para saber si es un número primo comprobaremos que ninguno de los números comprendidos en el intervalo 2-16, ambos inclusive, son divisores. Vamos a ver el programa que pide un número por teclado y nos comprueba si es primo. En este caso vamos a utilizar una función. Esta retornará un 1 ó un 0 dependiendo si el número es o no es primo. #include <stdio.h> int esprimo (int); //retorna 1 si el número que se le pasa es un número primo y 0 en caso contrario int main() { char a; printf("dame un número:\n"); scanf("%d",&a); if (esprimo(a)==1) { printf("es un número primo\n"); } else { printf("no es un número primo\n"); } } int esprimo (int n) { int i; for (i=2;i<=n-1;i++) { if (n%i==0) { return 0; } } return 1; } 4 5.Sacar los dígitos de un número uno a uno En el sistema decimal, el sistema que estamos habituados a usar, la forma de obtener los dígitos de un número es la siguiente: Dividimos el número entre 10 Obtenemos el resto->Éste será el último dígito del número. Nos quedamos con el divisor-> En el siguiente paso el número pasará a ser el divisor, repitiendo el proceso hasta que el número llegue a ser 0. Vamos a verlo con un ejemplo: Número 1894. Paso 1: Resto de 1894 entre 10: 4 Divisor de 1894 entre 10: 189 Paso 2: Resto de 189 entre 10: 9 Divisor de 189 entre 10: 18 Paso 3: Resto de 18 entre 10: 8 Divisor de 18 entre 10: 1 Paso 4: Resto de 1 entre 10: 1 Divisor de 1 entre 10: 0 Paso 5: Este paso ya no llega a darse porque el número ha llegado a 0. Como puede verse los dígitos del número se obtienen en orden inverso, en este caso, el 4, el 9, el 8 y finalmente el 1. 5 Vamos a ver el programa que pide un número por teclado y muestra por pantalla los dígitos que lo componen: #include <stdio.h> int main() { int n,resto; printf("dame el número:\n"); scanf("%d",&n); while (n!=0) { resto=n%10; printf("%d:\n",resti); n=n/10; } } El programa pide un número por pantalla y muestra cada uno de los dígitos que lo componen en una línea. 6 6.Invertir un número Para invertir un número nos apoyaremos en el algoritmo anterior. Volveremos a tomar como ejemplo el número 1894, cuyo número inverso es 4981. Al principio del algoritmo el número inverso valdrá 0, y en cada uno de los pasos haremos la operación inverso=inverso*10 + resto. Inverso=0 Paso 1: Resto de 1894 entre 10: 4 Inverso=0*10+4 -> Divisor de 1894 entre 10: 189 El inverso valdrá 4 Paso 2: Resto de 189 entre 10: 9 I nverso=4*10+9 -> Divisor de 189 entre 10: 18 El inverso valdrá 49 Paso 3: Resto de 18 entre 10: 8 Inverso=49*10+8 -> Divisor de 18 entre 10: 1 El inverso valdrá 498 Paso 4: Resto de 1 entre 10: 1 Inverso=498*10+1 -> Divisor de 1 entre 10: 0 El inverso valdrá 4981 Paso 5: Este paso ya no llega a darse porque el número ha llegado a 0. El inverso será 4981 7 Vamos a ver cómo sería el programa que pide un número por teclado y calcula su inverso: #include <stdio.h> int main() { int n,resto,inverso,original; inverso=0; printf("dame el número:\n"); scanf("%d",&n); original=n; while (n!=0) { resto=n%10; inverso=inverso*10+resto; n=n/10; } printf("El inverso del número %d es %d:\n",original, inverso); } 8 7.Comprobar si un número es capicúa Para comprobar si un número es capicúa nos apoyaremos en el algoritmo anterior. Primero se invierte el número y se compara con el original. Si son iguales el número es capicúa. Ejemplo: el número 1375 no es capicúa, ya que el número invertido (5731) es diferente al original. #include <stdio.h> int main() { int n,resto,inverso,original; inverso=0; printf("dame el número:\n"); scanf("%d",&n); original=n; while (n!=0) { resto=n%10; inverso=inverso*10+resto; n=n/10; } If (inverso==original) { printf("El número es capicúa:\n"); } Else { printf("El número no es capicúa:\n"); } } 9 8.Calcular el factorial de un número Como todos sabemos el factorial de un número se obtiene multiplicando el número por todos los inferiores hasta llegar a 1. Como ejemplo podemos calcular el factorial de 5, que se calculará con la cuenta 5x4x3x2x1 = 120 Para calcularlo con un algoritmo puede hacerse de forma iterativa y de forma recursiva. 8.1.Algoritmo iterativo En el algoritmo iterativo iremos almacenando el resultado del producto en una variable acumuladora, finalizando el bucle cuando lleguemos al número 1. Si seguimos el ejemplo anterior en el que calculamos el factorial del número 5 tendríamos los siguientes pasos: Acumulador=1 (se inicializa a 1 ya que vamos a realizar multiplicaciones). En cada paso realizaremos las siguientes operaciones: Acumulador=acumulador*n Decrementar el número n Este bucle se repetirá cuando el número n llegue a valer 1. Paso 1: Acumulador= 1*5=5 N=4 Paso 2: Acumulador= 5*4=20 N=3 Paso 3: Acumulador= 20*3=60 N=2 Paso 4: Acumulador= 60*2=120 N=1 Paso 5: Acumulador= 120*1=120 N=0 El proceso finaliza ya que N vale 0, por lo tanto el factorial del número 5 será 120. 10 El programa que nos calcula el factorial de un número pedido por teclado podría ser de la siguiente forma: #include <stdio.h> int main() { int result,n; printf("dame el número:\n"); scanf("%d",&n); while (n!=0) { result=result*n; n=n-1; } printf("El factorial es %d\n",result); } 11 8.2. Algoritmo recursivo La solución recursiva de los algoritmos puede ser más evidente en ciertos problemas, si bien puede que en muchas ocasiones sea más ineficiente. En el caso del factorial de un número el algoritmo recursivo nos aporta una solución muy fácil de entender. De hecho, este algoritmo es el que siempre suele ponerse como ejemplo para explicar la recursividad. Factorial del número 5= 5x4x3x2x1 = 5 x factorial del número 4 Factorial del número 4= 4x3x2x1 = 4 x factorial del número 3 Factorial del número 3= 3x2x1 = 3 x factorial del número 2 Factorial del número 2= 2x1 = 2 x factorial del número 1 Factorial del número 1= es el caso base y vale 1. Como se puede en cada paso multiplicamos el número por el factorial del número anterior hasta que se llega al caso base en el que se retorna un 1. #include <stdio.h> int main() { int result,n; printf("elemento para calcular su factorial:\n"); scanf("%d",&n); res=factorial(n); printf("El factorial de %d es %d:\n",n,res); } int factorial (int n) { if (n==0) { return 1; } return n*factorial(n-1); } 12 9.Calcular el número de fibonacci de un número cualquiera El fibonacci de un número entero se calcula de la siguiente forma: F0=1 F1=1 Fi = Fi-1+ Fi-2 Es decir, los caos base son el fibonacci de los números 0 y 1 que vale 1. Para cualquier otro número su fibonacci se calcula sumando el del anterior más el del anterior al anteror. Ejemplo: El fibonacci de 8 será el fibonacci de 7 más el fibonacci de 6. Fibonacci de 0: 1 Fibonacci de 1: 1 Fibonacci de 2: 2 Fibonacci de 3: 3 Fibonacci de 4: 5 Fibonacci de 5: 8 Fibonacci de 6: 13 Fibonacci de 7: 21 Fibonacci de 8: 34 13 9.1.Algoritmo iterativo El algoritmo consistirá en utilizar 3 variables para ir almacenando los fibonacci de los números intermedios. A será el fibonacci del número anterior B será el fibonacci del número anterior al anterior En actual tendremos el valor del número fibonacci actual. Las variables a y b se inicializan en 1: A=1 // Representará el fibonacci del número 0 B=1 // Representará el fibonacci del número 1 La primera iteración nos dará el fibonacci de 3, la segunda de 4 y así sucesivamente: En cada paso la variable actual almacenará el valor de a más b. A pasará a tomar el valor de b. B pasará a tomar el valor de actual. 14 El programa que nos calcula el fibonacci de un número n pedido por teclado será de la siguiente forma: #include <stdio.h> void fib(); int main() { int n; printf("Dame el número N:\n"); scanf("%d",&n); fib(n); } void fib(int n) { int a,b,actual,i; if (n==0) { printf("fibonacci 0=1\n"); } else if (n==1) { printf("fibonacci 0=1\n"); printf("fibonacci 1=1\n"); } else { printf("1\n1\n"); a=1; b=1; for (i=2;i<=n;i++) { actual=a+b; a=b; b=actual; } printf("El fibonacci es %d\n",actual); } } 15 Exp.2 Exp. 9.2. Algoritmo recursivo La versión recursiva se calcula de la siguiente forma: Caso base: fibonacci del número 0: 1, fibonacci del número 1: 1 Recurrencia: el fibonacci de un número N se calcula sumando el fibonacci de N-1 y de N-2. Vamos a ver el algoritmo que nos hace el cálculo de forma recursiva: #include <stdio.h> int fib(int); int main() { int x,res; printf("dame el número:\n"); scanf("%d",&x); res=fib(x); printf("el fibbonacci de %d es %d\n",x,res); } int fib (int n) { if (n==0 || n==1) { return 1; } return fib(n-1)+fib(n-2); } 16