【问题标题】:return type while using GMP.h header file使用 GMP.h 头文件时的返回类型
【发布时间】:2010-06-06 19:23:51
【问题描述】:

当我使用 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 声明为返回数组的函数...

【问题讨论】:

  • 什么是mpz_t?它是数组的 typedef 吗?如果是这样,那么您不能返回 mpz_t

标签: c++ gmp


【解决方案1】:

可以在manual 中找到使用 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;
 }

【讨论】:

    【解决方案2】:

    尝试以下方法:

    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 标头。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-06-19
      • 2012-01-15
      • 2021-01-24
      • 2019-03-22
      • 1970-01-01
      • 2014-08-25
      • 1970-01-01
      • 2019-07-01
      相关资源
      最近更新 更多