元编程算法示例

来源:互联网 发布:python写入excel 编辑:程序博客网 时间:2024/06/06 17:40

  • 枚举思想
    • 鸡兔同笼问题
  • 递推思想
    • 斐波那契数列
  • 递归思想
    • 阶乘问题
  • 分治思想
    • 寻找假币问题


枚举思想

鸡兔同笼问题

// 主模板template <int Head, int Feet, int Index = 1, bool Condition = false>struct ChickRabbit {    enum {        Chicken = ChickRabbit<Head, Feet, Index+1, (2*Index+4*(Head-Index) == Feet)>::Chicken,        Rabbit = ChickRabbit<Head, Feet, Index+1, (2*Index+4*(Head-Index) == Feet)>::Rabbit    };};// 递归终止模板template <int Head, int Feet, int Index>struct ChickRabbit<Head, Feet, Index, true> {    enum {        Chicken = Index-1,        Rabbit = Head-Chicken    };};// 测试鸡兔同笼模板void testMP_CR() {    // 头30,足72    // 鸡24,兔6    // 测试通过    cout << "Head 30, Feet 72" << endl;    cout << "Chicken:" << ChickRabbit<30, 72>::Chicken << endl;    cout << "Rabbit:" << ChickRabbit<30, 72>::Rabbit << endl;    // 头50,足140    // 鸡30,兔20    // 测试通过    cout << "Head 50, Feet 140" << endl;    cout << "Chicken:" << ChickRabbit<50, 140>::Chicken << endl;    cout << "Rabbit:" << ChickRabbit<50, 140>::Rabbit << endl;    // 错误数据测试,会给出负数结果    cout << "Head 30, Feet 14" << endl;    cout << "Chicken:" << ChickRabbit<30, 14>::Chicken << endl;    cout << "Rabbit:" << ChickRabbit<30, 14>::Rabbit << endl;}

递推思想

斐波那契数列

// 主模板template <int N>struct Fibonacci {    enum {        number = Fibonacci<N-1>::number + Fibonacci<N-2>::number    };};// 特化递归终止模板template <>struct Fibonacci<0> {    enum {        number = 0    };};// 特化递归终止模板template <>struct Fibonacci<1> {    enum {        number = 1    };};// 测试斐波那契数列void testMP_Fibonacci() {    cout << "Fibonacci 0~12:" << endl;    cout << "Fibonacci<0>::number:" << Fibonacci<0>::number << endl;    cout << "Fibonacci<1>::number:" << Fibonacci<1>::number << endl;    cout << "Fibonacci<2>::number:" << Fibonacci<2>::number << endl;    cout << "Fibonacci<3>::number:" << Fibonacci<3>::number << endl;    cout << "Fibonacci<4>::number:" << Fibonacci<4>::number << endl;    cout << "Fibonacci<5>::number:" << Fibonacci<5>::number << endl;    cout << "Fibonacci<6>::number:" << Fibonacci<6>::number << endl;    cout << "Fibonacci<7>::number:" << Fibonacci<7>::number << endl;    cout << "Fibonacci<8>::number:" << Fibonacci<8>::number << endl;    cout << "Fibonacci<9>::number:" << Fibonacci<9>::number << endl;    cout << "Fibonacci<10>::number:" << Fibonacci<10>::number << endl;    cout << "Fibonacci<11>::number:" << Fibonacci<11>::number << endl;    cout << "Fibonacci<12>::number:" << Fibonacci<12>::number << endl;}

递归思想

阶乘问题

// 主模板template <int N>struct Factorial {    enum {        number = N*Factorial<N-1>::number    };};// 递归终止模板template <>struct Factorial<1> {    enum {        number = 1    };};// 测试阶乘void testMP_Factorial() {    cout << "Factorial<5>::number:" << Factorial<5>::number << endl;}

分治思想

寻找假币问题

// 主模板template <int coin1 = 2, int coin2 = 2, int ... coins>struct FindCoin {    enum {        coinIndex = (coin1==coin2 ? 2+FindCoin<coins...>::coinIndex : FindCoin<coin1, coin2>::coinIndex)    };};// 递归终止模板template <int coin1, int coin2>struct FindCoin<coin1, coin2> {    enum {        coinIndex = (coin1 >= coin2 ? 2:1)    };};// 测试寻找假币void testMP_FindCoin() {    // 定义硬币    const int coin1 = 2;    const int coin2 = 2;    const int coin3 = 2;    const int coin4 = 2;    const int coin5 = 2;    const int coin6 = 1;    const int coin7 = 2;    const int coin8 = 2;    const int coin9 = 2;    const int coin10 = 2;    // 得出结果    cout << "假币是第" << FindCoin<coin1, coin2, coin3, coin4, coin5, coin6, coin7, coin8, coin9, coin10>::coinIndex << "个" << endl;}

CSDN 辣鸡 MD 编辑器,无序列表格式全丢

原创粉丝点击