0

定数配列power[501] = {1, p % MODER, p*p % MODER, p*p*p % MODER, ..., p^500 % MODER} (p は定数) を生成したい番号。

次のコードを使用してp^n % MODERを生成できることはわかっています。

template<int a, int n> struct pow
{
  static const int value = a * pow<a, n-1>::value % MODER;
};
template<int a> struct pow<a, 0>
{
  static const int value = 1;
};

そして、それはうまくいきます!

私の質問は、必要な配列を生成できるかどうかです。

4

2 に答える 2

4

次のように使用できますBOOST_PP_ENUM

#include <iostream>
#include <boost/preprocessor/repetition/enum.hpp>

#define MODER 10

template<int a, int n> struct pow
{
  static const int value = a * pow<a, n-1>::value % MODER;
};
template<int a> struct pow<a, 0>
{
  static const int value = 1;
};

#define ORDER(count, i, data) pow<data,i>::value

int main() {
  const int p = 3;
  int const a[] = { BOOST_PP_ENUM(10, ORDER, p) };
  std::size_t const n = sizeof(a)/sizeof(int);
  for(std::size_t i = 0 ; i != n ; ++i ) 
    std::cout << a[i] << "\n";
  return 0;
}

出力:

1
3
9
7
1
3
9
7
1
3

オンラインデモを見る

この線:

int const a[] = { BOOST_PP_ENUM(10, ORDER, p) };

これに展開します:

int const a[] = { pow<p,0>::value, pow<p,1>::value, ...., pow<p,9>::value};
于 2012-07-26T08:51:38.847 に答える
1

n上限がない限り、それは不可能だと思います。この質問をチェックしてください。プリプロセッサをチューリング完全マシンのように見せる方法はいくつかありますが、コード サイズが のオーダーで増加するという事実を受け入れる場合に限られますn。これは、事前に計算された配列を手動で配置するよりも優れているわけではありません。

重要な更新:この質問も表示されるはずです。プリプロセッサではなく、テンプレート エンジンは確かにチューリング完全 (少なくとも再帰は可能) のようです。ですから、答えはイエスだと思います。

于 2012-07-26T08:58:14.667 に答える