c++ 使用GMP.h头文件时返回类型

wb1gzix0  于 11个月前  发布在  其他
关注(0)|答案(3)|浏览(129)

虽然我使用gmp. h头文件.我需要一个函数,它需要输入类型mpz_t和返回mpz_t类型太.我是非常初学者使用gmp. h所以,这里是快照如下我接近的代码.

mpz_t sum_upto(mpz_t max)  
{    
    mpz_t sum;  
    mpz_init(sum);    
    mpz_init(result);  
    for(int i=0;i<=max-1;i++)    
        mpz_add_ui(sum,sum,pow(2,i));   
    return sum;   
}

字符串
但它会显示错误:

  1. pow还没有在这个范围内使用。",尽管我在文件的开头添加了math.h。
  2. sum_upto声明为返回数组的函数.
zf2sa74q

zf2sa74q1#

使用GMP的函数的约定可以在手册中找到。本质上,你必须遵循GMP本身的约定-函数必须有一个void返回类型,并且你必须提供一个值,将结果作为参数放入其中。
下面是给出的示例:

void foo (mpz_t result, const mpz_t param, unsigned long n)
 {
   unsigned long  i;
   mpz_mul_ui (result, param, n);
   for (i = 1; i < n; i++)
     mpz_add_ui (result, result, i*7);
 }

 int main (void)
 {
   mpz_t  r, n;
   mpz_init (r);
   mpz_init_set_str (n, "123456", 0);
   foo (r, n, 20L);
   gmp_printf ("%Zd\n", r);
   return 0;
 }

字符串

1u4esq0p

1u4esq0p2#

尝试以下操作:

mpz_t sum_upto(mpz_t max)
{
    mpz_t sum;
    mpz_init(sum);
    mpz_init(result);
    int val = 1;
    for(int i=0;i<=max-1;i++) {
        mpz_add_ui(sum,sum,val);
        val *= 2; //compiler should make a shift operation out of it
    }
    return sum;
}

字符串
此外,您可以删除math.h头。

i1icjdpr

i1icjdpr3#

mpz_t的返回并不返回对象,而只是一个指针,这几乎肯定不是我们想要的。
下面是一个例子,接受一个mpz_t参数,进行计算,并将结果存储到指定的参数中。

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

mpz_t *sum_upto(mpz_t *sum, int max) {
    mpz_t nval;
    mpz_init(nval);

    for (int i = 0; i < max; i++) {
        mpz_ui_pow_ui(nval, 2, i); /* nval = pow(2, i) */
        mpz_add(*sum, *sum, nval); /* sum = sum + nval */
    }

    return sum;
}

int main() {

    mpz_t sum;
    mpz_init_set_ui(sum, 0);

    gmp_printf("%Zd\n", sum_upto(&sum, 1000));
    mpz_clear(sum);

    return 0;
}

字符串

相关问题