1.Introducción

Anuncio
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
Descargar