2

我正在使用 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

有什么方法可以让这个工作吗?

4

3 回答 3

3

你不能直接比较,m因为m是(粗略地说)一个指针。您需要使用 GMP 中包含的比较功能。见http://gmplib.org/manual/Integer-Comparisons.html#Integer-Comparisons

于 2012-09-05T19:04:43.847 回答
0

使用mpz_cmp代替m == 0

if(mpz_cmp(m,0)  == 0)
    printf("number is even\n");
else
    printf("number is odd\n");
于 2017-03-23T07:27:27.893 回答
0

答案“你不能直接与 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)or mpz_cmp_si(m,0L),而不是mpz_cmp其他答案中建议的,因为它m与前面解释的零指针进行比较。

于 2021-12-18T01:29:19.713 回答