我正在使用libgmp创建一个简单的程序。我可以gmp_printf所有的gmp整数,所以我知道这些是初始化和分配正确的。当我尝试一个简单的if-else条件时,问题就出现了。
mpz_t n;
mpz_t c;
mpz_t m;
mpz_init(n);
mpz_init(c);
mpz_init(m);
mpz_set_str(c, "2", 10);
mpz_set_str(n, "2038074744", 10);
mpz_mod(m, n, c);
gmp_printf("\n%Zd\n%Zd\n%Zd\n", n, c, m);
if(m == 0)
{
printf("number is even\n");
}
else
{
printf("number is odd\n");
}实际数字打印为0,但始终显示else printf。
2038074744
2
0
number is odd有没有什么方法可以让它工作呢?
发布于 2012-09-06 03:04:44
您不能直接与m进行比较,因为m (粗略地说)是一个指针。您需要使用GMP中包含的比较函数。请参阅http://gmplib.org/manual/Integer-Comparisons.html#Integer-Comparisons
发布于 2017-03-23 15:27:28
使用mpz_cmp而不是m == 0
if(mpz_cmp(m,0) == 0)
printf("number is even\n");
else
printf("number is odd\n");发布于 2021-12-18 01:29:20
回答“不能直接与m比较,因为m(粗略地说)是一个指针”几乎是正确的,m是一种mpz_t类型,它是在gmp.h中定义的结构
typedef struct
{
int _mp_alloc;
int _mp_size;
mp_limb_t *_mp_d; /* Pointer to the limbs. */
} __mpz_struct;
typedef __mpz_struct mpz_t[1];但您应该使用mpz_cmp_ui(m,0UL)或mpz_cmp_si(m,0L),而不是另一个答案中建议的mpz_cmp,因为它会像前面解释的那样将m与零指针进行比较。
https://stackoverflow.com/questions/12273056
复制相似问题