Comprobando Tarjetas
Aunque tiene una utilidad limitada (por no decir nula), voy a explicar como comprobar si una tarjeta de crédito/debido es correcta, es decir, si el Nº de tarjeta es válido.
El sistema es bien sencillo, y se implementa en un simple algoritmo sin dificultad.
La idea es multiplicar por 2 los numeros de las posiciones impares. Si cada uno de estos números ya multiplicados, tiene 2 digitos, sumarlos para que solo quede en uno.
Tras esto, sumamos los valores calculados con los de las posiciones pares (que no hemos modificado).
Si el valor total calculado, es múltiplo de 10, entonces tendremos un número válido, en caso contrario será erroneo.
Para aclararlo un poco, un ejemplo:
Tenemos el siguiente numero de tarjeta: 4202 3174 4115 3256 (Nº inventado)
lo que hacemos es multiplicar por 2 los nºs de las posiciones impares, es decir
4x2 =8
0x2=0
3x2=6
7x2=14 (Como tiene 2 digitos, los sumamos) 4+1=5
4x2=8
1x2=2
3x2=6
5x2=10 (Como tiene 2 digitos, los sumamos) 1+0=1
Digamos que el número que tenemos, tras operar esto, es:
8202 6154 8125 6216
Simplemente sumamos esto:
8+2+0+2+6+1+5+4+8+1+2+5+6+2+1+6= 59
Como 59 no es múltiplo de 10, tenemos un número erroneo.
Viendo que es 59, podriamos modificar el primer valor '2' por un 3, y sumaria 60, tendriamo un numero válido. es decir, 4302 3174 4115 3256 es un nº válido.
Un programa para verificar esto en C# de forma rapida y a traves de consola (con nº de tarjeta por parámetro en la ejecucion) seria algo asi (sin control de errores ni nada por el estilo)
static void Main(string[] args)
{
Console.WriteLine("Nº de Tarjeta: {0}",args[0]);
if (CVValido(args[0]))
Console.WriteLine("Numero Valido");
else
Console.WriteLine("Numero Erroneo");
Console.ReadKey();
}
static bool CVValido(string numero)
{
int conta;
int acum=0;
int n;
for (conta = 0; conta < numero.Length; conta++)
{
if (conta % 2 == 0)
{
n = 2 * (int.Parse(numero[conta].ToString()));
if (n > 9)
n -= 9;
}
else
n = (int.Parse(numero[conta].ToString()));
acum += n;
}
return acum % 10 == 0;
}
En C quedaria así:
#include<stdio.h>
int CVValido(char *numero);
int main(int argc, char *argv[])
{
printf("Nº de Tarjeta: %s\n",argv[1]);
if(CVValido(argv[1]))
printf("Numero Valido\n");
else
printf("Numero Erroneo\n");
}
int CVValido(char *numero)
{
int conta;
int acum=0;
int num=0;
char temp;
for(conta=0;conta<strlen(numero);conta++)
{
temp=numero[conta];
if(conta % 2 ==0)
{
sscanf(&temp,"%d",&num);
num*=2;
if(num>9)
num-=9;
}
else
sscanf(&temp,"%d",&num);
acum+=num;
}
return (acum % 10)==0;
}
Ya podeis probar con vuestra tarjeta, vereis que se cumple.