Rosettacode 有一个 article用于计算 Bernoulli numbers .不幸的是,它没有提供 C++ 示例,仅提供一个 C 示例(截至 2016 年 12 月 27 日)。
我对 C 不熟悉,但其中很多是可以识别的。该程序如何适用于 C++?
#include <stdlib.h>
#include <gmp.h>
#define mpq_for(buf, op, n)\
do {\
size_t i;\
for (i = 0; i < (n); ++i)\
mpq_##op(buf[i]);\
} while (0)
void bernoulli(mpq_t rop, unsigned int n)
{
unsigned int m, j;
mpq_t *a = malloc(sizeof(mpq_t) * (n + 1));
mpq_for(a, init, n + 1);
for (m = 0; m <= n; ++m) {
mpq_set_ui(a[m], 1, m + 1);
for (j = m; j > 0; --j) {
mpq_sub(a[j-1], a[j], a[j-1]);
mpq_set_ui(rop, j, 1);
mpq_mul(a[j-1], a[j-1], rop);
}
}
mpq_set(rop, a[0]);
mpq_for(a, clear, n + 1);
free(a);
}
int main(void)
{
mpq_t rop;
mpz_t n, d;
mpq_init(rop);
mpz_inits(n, d, NULL);
unsigned int i;
for (i = 0; i <= 60; ++i) {
bernoulli(rop, i);
if (mpq_cmp_ui(rop, 0, 1)) {
mpq_get_num(n, rop);
mpq_get_den(d, rop);
gmp_printf("B(%-2u) = %44Zd / %Zd\n", i, n, d);
}
}
mpz_clears(n, d, NULL);
mpq_clear(rop);
return 0;
}
谢谢!即使是一般性建议也很有帮助!
最佳答案
它可以在 C++ 上工作而无需更改我猜的几乎所有内容,无论如何您可以更改一些内容:
malloc
对于new
:mpg_t * a = new mpg_t[n+1];
或:
mpq_t * a = (mpq_t *) malloc(sizeof(mpq_t) * (n + 1));
NULL
对于nullptr
大多数 C 库已重命名(并弃用)自:
something.h
至csomething
#include <stdlib.h>
现在是#include <cstdlib>
你可以写(包含在
cstdint
header 中):for (uint32_t i = 0; i <= 60; ++i) { /* ... */ }
代替:
unsigned int i;
for (i = 0; i <= 60; ++i) { /* ... */ }
关于c++ - 将 C 重构为 C++ 以进行伯努利数计算,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40444878/