为伯努利数计算重构C到c++
Refactoring C to C++ for Bernoulli Number calculation
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
fornew
:mpg_t * a = new mpg_t[n+1];
或:
mpq_t * a = (mpq_t *) malloc(sizeof(mpq_t) * (n + 1));
-
NULL
fornullptr
-
大多数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,只需创建一个名为伯努利的类(例如),它将包含伯努利函数和宏,
就是这样!
相关文章:
- 如何重构类层次结构以避免菱形问题
- Visual studio代码重构似乎不起作用(例如,重命名符号-f2)
- C++-将具有引用的长参数列表重构为结构
- 重构使用动态强制转换的 std::set 的比较运算符
- C++中的命名空间重构
- 将具有相反操作数的两个函数重构为一个
- 重构模板类,该类将其嵌套类用作另一个类的模板参数
- 我当前实现的双向链表类是否需要重构迭代器 end() 功能?
- C++重构,扩展方法typedef
- 重构类:无法将派生类中成员函数的公共代码移回基类
- 重构MFC消息映射以包括完全限定的成员函数指针
- 重构建议?
- 包装器函数可以重构吗?
- 重构此代码以进行优化
- 将 Arduino 草图重构为 C++ 类
- 重构为模板类
- 重构 C++ 中的特定嵌套循环
- 重构嵌套绑定以使用 lambda 函数
- Xcode 9 重构 对C++的支持
- 重构开关或 if/else 语句?