我有一个名为“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/