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

Refactoring C to C++ for Bernoulli Number calculation

本文关键字:重构 c++ 计算      更新时间:2023-10-16

Rosettacode有一篇关于计算伯努利数的文章。不幸的是,它没有提供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 / %Zdn", i, n, d);
        }
    }
    mpz_clears(n, d, NULL);
    mpq_clear(rop);
    return 0;
}

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

我猜它可以在c++上工作而不需要改变几乎任何东西,无论如何,有一些事情你可以改变:

  • malloc for new: mpg_t * a = new mpg_t[n+1];

    或:mpq_t * a = (mpq_t *) malloc(sizeof(mpq_t) * (n + 1));

  • NULL for 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) { /* ... */ }

基本上任何C代码都可以在c++上运行

对于最小折射到OOB,只需创建一个名为伯努利的类(例如),它将包含伯努利函数和宏,

就是这样!