
Esta practica debe aceptar numerotes muy grandotes, por ello estoy empleando el tipo de dato mpz_t de la librería gmp.h, el problema que tengo es a mi parecer raro puesto que si pongo por ejemplo el numero 130000 me dice que la suma es 16900000000 , pero si pongo 130960 dice: Violacion de segmento. (El programa permite al usuario volver a ingresar otro numero si asi lo desea).
Lo extraño viene cuando despues vuelvo a correr el programa e ingreso el numero 130000, me da el resultado, luego ingreso 130920, me da el resultado, despues ingreso 130940, da el resultado y despues pongo exactamente el 130960 y ahora si sale el resultado (17150521600), pero ahora si pongo un numero mas grande vuelve a salir: Violacion de segmento.

Mi código es el siguiente (anexo solamente el main y la funcion recursiva):
int main() {
mpz_t numero,sum,resta,resta2,mul;
int again;
//double n, sum;
mpz_init(numero);
mpz_init(sum);
mpz_init(resta);
mpz_init(resta2);
mpz_init(mul);
system("clear");
cout<<"\t\tBienvenido a la Practica 3"<<endl<<endl;
do {
pedir(numero);
gmp_printf("tu numero es: %Zd \n", numero);
mpz_set_str(sum,"0", 10); //inicializo sum
mpz_set_str(resta,"0", 10); //inicializo resta
mpz_set_str(resta2,"0", 10); //inicializo resta2
mpz_set_str(mul,"0", 10); //inicializo mul
suma(numero,resta,sum,mul,resta2);
gmp_printf("La suma es: %Zd \n", sum);
again = otraVez("\n\tDeseas ingresar otro numero ");
}while(again == 1);
return 0;
}
// Funcion recursiva
void suma(mpz_t n,mpz_t resta,mpz_t sum,mpz_t mul,mpz_t resta2) {
if((mpz_cmp_ui(n, 1)) == 0 || (mpz_cmp_ui(n, 1)) < 0){ // n<=1
mpz_add_ui(sum, sum, 1);
}
else{
mpz_mul_ui(mul, n, 2);
mpz_sub_ui(resta2, mul, 1);
mpz_add(sum, sum, resta2);
mpz_sub_ui(resta, n, 1);
suma(resta,resta,sum,mul,resta2);
}
}
¿Alguno de ustedes sabe como puedo corregir esto?
De antemano gracias por su ayuda.