我正在开发一个程序来计算C ++中非常大的数字(20位或更多)并使用GMP来处理溢出问题。我的程序适用于大约10位数或更少的数字,但是当我丢弃一个15位数时,它会爆炸。我要将我的程序简化为一行,如下所示:
#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位数字,加或减。
谢谢!
答案 0 :(得分:3)
您尝试分配给n
的数字显然太大而无法容纳任何标准整数类型,这解释了gmp的使用,但这也意味着您(您的程序)将无法在任何容量中使用数字作为整数(包括初始化/赋值函数)。将大数分配给mpz
的最简单方法是使用该数字的字符串文字表示:
mpz_class n;
n = "48112959837082048697";
请注意,组合初始化/分配不起作用,即:
mpz_class n = "48112959837082048697"; // Error converting
附注:您不需要包含stdio.h
和gmp.h
,因为它们分别包含在iostream
和gmpxx.h
中。