, estoy realizando una programa para mi escuela en c++ bajo una máquina virtual en Linux (AntiX), el programa se basa en realizar la suma de los n primeros números enteros impares a través de una función recursiva, es decir, si tecleamos 3, el resultado será 9 que es la suma de 1 más 3 más 5.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.





Autor


En línea


lo más probable es que se dé porque no especificaste la precisión en bytes o porque no inicializaste un numero (las 2 razones más comunes que me dio a mi esa librería)