当我使用 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;
}
但是会显示错误:
使用 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;
}
尝试以下操作:
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
标题。
返回 mpz_t 不会返回对象,只返回一个指针,这几乎肯定不是我们想要的。
解决方案1:
这是一个接受 mpz_t 参数、进行计算并将结果存储到指定参数的示例。
gmpsum1.c
#include <stdio.h>
#include <gmp.h>
void 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 */
}
}
int main() {
mpz_t sum;
mpz_init_set_ui(sum, 0);
sum_upto(sum, 100);
gmp_printf("%Zd\n", sum);
mpz_clear(sum);
return 0;
}
$ gcc gmpsum1.c -lgmp -o gmpsum1
$ ./gmpsum1
1267650600228229401496703205375
解决方案2:
这是一个接受 mpz_t 参数、进行计算并将结果存储到指定参数的示例。
gmpsum2.c
#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, 100));
mpz_clear(sum);
return 0;
}
$ gcc gmpsum2.c -lgmp -o gmpsum2
$ ./gmpsum2
1267650600228229401496703205375