2012-03-02 2 views
2

Я работаю над программой для вычисления очень больших чисел (20 цифр или более) на C++ и использую GMP для решения проблем с переполнением. Моя программа работает хорошо для чисел около 10 цифр или меньше, но когда я бросаю в нее 15-значное число, он взрывается. Я буду кипеть мою программу вниз просто одна линия, как это:Переполнение GMP при использовании больших чисел

#include <iostream> 
#include <stdio.h> 
#include <gmp.h> 
#include <gmpxx.h> 

using namespace std; 

int main() 
{ 
    mpz_class n = 48112959837082048697; //this blows up 
    return 0; 
}  

Если я заменить эту строку с

mpz_class n = 12623773; 

тогда все работает просто отлично.

Здесь ошибка:

$ g++ -o main main.cpp -lgmpxx -lgmp 
main.cpp: In function ‘int main()’: 
main.cpp:21:19: error: conversion from ‘long long int’ to ‘mpz_class’ is ambiguous 
/usr/include/gmpxx.h:1563:3: note: candidates are: __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(double) 
/usr/include/gmpxx.h:1562:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(float) 
/usr/include/gmpxx.h:1560:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(long unsigned int) 
/usr/include/gmpxx.h:1559:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(long int) 
/usr/include/gmpxx.h:1557:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(short unsigned int) 
/usr/include/gmpxx.h:1556:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(short int) 
/usr/include/gmpxx.h:1554:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(unsigned int) 
/usr/include/gmpxx.h:1553:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(int) 
/usr/include/gmpxx.h:1551:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(unsigned char) 
/usr/include/gmpxx.h:1550:3: note:     __gmp_expr<__mpz_struct [1], __mpz_struct [1]>::__gmp_expr(signed char) 

Кто-нибудь знает, как это исправить, так что я могу использовать большое количество? Я думал, что GMP должен был позволить что-то вроде 500 цифр, плюс или минус.

Спасибо!

ответ

3

Число, которое вы пытаетесь присвоить n, очевидно, слишком велико, чтобы вписаться в любой из стандартных целых типов, что объясняет использование gmp, но это также означает, что вы (ваша программа) не сможете использовать номер как целое число в любой емкости (включая функции инициализации/назначения). Самый простой способ назначить большое количество к mpz является использование строкового литерала представление этого числа:

mpz_class n; 
n = "48112959837082048697"; 

Обратите внимание, что в сочетании инициализации/назначение не будет работать, а именно:

mpz_class n = "48112959837082048697"; // Error converting 

примечание стороны : Вам не нужно включать stdio.h и gmp.h, так как они включены от iostream и gmpxx.h соответственно.

 Смежные вопросы

  • Нет связанных вопросов^_^