为伯努利数计算重构C到C ++

时间:2016-11-06 00:45:55

标签: c++ c math refactoring

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;
}

谢谢!即使是一般性建议也很有帮助!

2 个答案:

答案 0 :(得分:1)

它可以在C ++上运行而不会改变我猜的几乎任何东西,无论如何有一些你可以改变的东西:

  • malloc newmpg_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标题中):

    for (uint32_t i = 0; i <= 60; ++i) { /* ... */ }

    而不是:

    unsigned int i;

    for (i = 0; i <= 60; ++i) { /* ... */ }

答案 1 :(得分:0)

基本上任何C代码都将在C ++上运行

为了最小化折射到OOB,只需创建一个名为bernoully的类(例如),它将包含bernoulli函数和宏,

就是这样!