c++ - 如何将此 C++ 函数从使用 long 转换为其他类型?

标签 c++ gmp

我有一个名为“s”的原始 C++ 函数:

long s(long n) {
  long sum = 0;
  long m;

  m = (long) sqrt(n);
  for (long i = 2; i < m; i++)
    if ((n % i) == 0) sum += (i + (n/i));
  if (n>1) sum += 1;
  if ((m*m) == n) sum += m;
  return sum;
}

我一直在努力将此函数转换为使用 GMP 的 mpz 类型,以便它允许任意长的整数。

这是我的尝试:

void s(mpz_t n, mpz_t *final)
{
    mpz_t sum;
    mpz_t m;
    mpz_t temp;

    mpz_init (sum);
    mpz_init (m);
    mpz_init (temp);

    mpz_set_str (sum, "0", 10);

    mpz_sqrt(m, n);
    for (mpz_t i, mpz_init(i), mpz_set_str(i, "2", 10); mpz_cmp(i,m)< 0; mpz_add_ui(i, i, 1))
    {
        mpz_mod(temp, n, i);
        if (mpz_cmp_si(temp, 0) == 0)
        {
            // use divexact since we know they are divisable
            mpz_divexact(temp, n, i);
            mpz_add(temp, temp, i);
            mpz_add(sum, sum, temp);
        }
    }

    if (mpz_cmp_si(n, 1) > 0) mpz_add_ui(sum, sum, 1);

    mpz_mul(temp, m, m);
    if (mpz_cmp(temp, n) == 0) mpz_add(sum, sum, m);
    final = sum;
}

完整的原始程序可以在这里找到:http://pastebin.com/mf751592

我做错了什么?我最初似乎遇到了麻烦,因为我无法返回 mpz_t 类型。因此,我传入了一个指向我希望函数返回的内容的指针。

尽管如此,我仍然在挣扎。有人能指出我正确的方向吗?

这一行: for (mpz_t i, mpz_init(i), mpz_set_str(i, "2", 10); mpz_cmp(i,m)< 0; mpz_add_ui(i, i, 1))
给出此错误:23:错误:无法使用此语法初始化数组

最佳答案

你基本上走在正确的轨道上。但是,两个函数参数都应为 mpz_t 类型。所以标题就像:

void s(mpz_t n, mpz_t final)

最后不需要 Final = sum 。相反,只要在使用 sum 的地方使用 final 即可。另外,请执行以下操作:

mpz_t i;
for (mpz_init_set_ui(i, 2); mpz_cmp(i,m) < 0; mpz_add_ui(i, i, 1))

for 循环。调用如下:

mpz_t final, n;
mpz_init(final);
mpz_init_set_ui(n, 5);
s(n, final);

编辑:正如 Steve314 所指出的,您应该为每个 mpz_init 执行 mpz_clear 。由于您可以让调用者传递 initted Final,因此需要清理 m、temp 和 i。

关于c++ - 如何将此 C++ 函数从使用 long 转换为其他类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2259395/

相关文章:

c++ - 与语言服务器通信(语言服务器协议(protocol))

c++ - std::list<std::future> 析构函数不阻塞

c++ - 如何获取 printf 样式的编译时警告或错误

c++ - GMP mpf 函数导致段错误

c - 如何在发生之前或之后检测 GMP 中的尾数精度溢出?

C++ 类设计 "helper functions"

c++ - 为什么不能在声明中包含多个 decl-specifier-seq?

macos - 为什么 Nettle 2.4's ` configure` 找不到 GMP 5.0.2?

c - 尝试将GNU GMP库中的类型用作Bison的yylval类型时出错

cpu功耗和设置位