2016-11-06 6 views
0

Rosettacodeは、Bernoulli numbersの計算のためにarticleを持っています。残念ながら、C++での例は提供されていません(2016年12月27日現在)。ベルヌーイのCからC++へのリファクタリング数計算

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

ありがとうございます!一般的な推奨事項も役立ちます!

+0

GMPにはC++バージョンがありますか? –

+0

@ IgnacioVazquez-Abramsクイック検索から、私はそれが見つけられませんでした。私が見つけることができたものから、選択されたアルゴリズムはわずかしかなかった(ベルヌーイ数ではない)が、ここで間違っているかもしれない。 https://gmplib.org/manual/Other-Algorithms.html#Other-Algorithms – esote

+0

特定のC++バージョンを持っていない場合、なぜコードを移植する必要があると思いますか? –

答えて

1
それは私が推測するほとんど何も変更せずにC++に働くだろう

、とにかくあなたが変更される可能性がいくつかあります:

  • mallocnew用:mpg_t * a = new mpg_t[n+1];

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

  • は、 NULLnullptr

  • ほとんどのCライブラリは、から名前を変更(および非推奨)されています:something.hcsomething #include <stdlib.h>に今あなたが書くことができ#include <cstdlib>

  • です(cstdintヘッダに含まれる):

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

    の代わりに:

    unsigned int i;

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

+0

タイプが利用可能なシステムでは(実際にはすべて)、 ''は 'std :: uint32_t'を利用できることが保証されています。その名前をグローバル名前空間に入れるには、単に 'uint32_t'のように' 'を含めます。C++ではCヘッダではない: ' 'で定義され、Cヘッダで定義されている。 –

+0

また、 "これはC++で動作しますが、何も変えずに動作します"というコードは、mallocから結果をキャストせずにC++としてコンパイルされませんでした。 –

+0

はい、そうです。 –

0

基本的には任意のCコードだけでベルヌーイ機能やマクロが含まれます(たとえば)bernoullyというクラスを作成し、OOBの最小屈折のためにC++

上で実行されます、

それです!

関連する問題