Cuando en el programa meto, por ejemplo, una unidad más del valor máximo (2^31), el programa lo toma como negativo, y no funciona como debería. Lo he intentado con otros tipos de datos, unsigned, long, etc. pero no consigo solucionarlo. Lo raro es que con algunos de los valores que superan ese máximo sí funciona el programa, y con otros no.
El código de ese programa os lo pongo a continuación; en otro necesito también valores altos (para calcular factoriales de números relativamente altos).
Para que entendáis el sentido del programa, os pongo la condición para que el número sea válido.
Citar
Suponer que los numero de las cuentas corrientes son de 10 dígitos. El ultimo digito de la suma de los primeros 9 dígitos debe de ser el mismo que el decimo digito.
Código
#include <stdio.h> //Definición de funciones int cantidadDigitos(int num); int sumaDigitos(int num); int ultimoDigito(int num); void comprobaciones(int numero); //Cuerpo del programa int main() { int numero; //Número de tarjeta de crédito //Hasta meter un número positibo, no saldrá del bucle do{ if(numero < 0) { } }while(numero < 0); comprobaciones(numero); return 0; } int cantidadDigitos(int num) { int i = 0; //Para contar el número de dígitos int numAux = num; //Variable auxiliar while(numAux > 0) //Hasta que no sea 0... { numAux /= 10; //...pasamos al siguiente dígito i++; //...y un dígito más que tenemos } return i; } int sumaDigitos(int num) { int suma = 0; //para guardar la suma entre los 9 primeros digitos del numero de la tarjeta int divisor = 1000000000; //Para sacar los dígitos de uno en uno, empezando por el más significativo int resto = num; //auxiliar, para avanzar de dígito en dígito int ultimo_digito = 0; //Batuketaren azken digitua gordeko duen aldagaia int i; //Buklerako for(i=0; i<9; i++) { suma += (resto/divisor); //la suma entre los dígitos resto = resto % divisor; //pasamos al siguiente dígito divisor /= 10; //y para sacar el siguiente digito } ultimo_digito = ultimoDigito(suma); //El último dígito de la suma return ultimo_digito; } int ultimoDigito(int num) { int digito = 0; digito = num % 10; return digito; } void comprobaciones(int numero) { int cantidad = 0; int suma_digitos = 0; //Calculamos en número de dígitos cantidad = cantidadDigitos(numero); //Si la cantidad de dígitos es correcta (10) if(cantidad == 10) { //Si el último dígito de la suma de los primeros 9 dígitos es igual al último dígito de la tarjeta: if(sumaDigitos(numero) == ultimoDigito(numero)) { } else { } } //Si el número de dígitos no es el correcto else { } }