剑指offer-正整数连续序列累加求和,限制使用常规方法

/*******************************************************************
Copyright(c) 2016, Tyrone Li
All rights reserved.
*******************************************************************/
// 作者:TyroneLi
//
 
/*
Q1:
    求1+2+3+...+n=?:
        实现上述的累加运算,但是不能使用乘除法、for、while、if、else、
        switch、case。等关键字及条件判断语句(A?B:C)。
S1:
    根据要求发现循环递归等常规方法都无法实现。
    1: 使用c++中的构造函数,用构造函数去帮忙实现,但是这里需要借助静态变量;
    2:使用c++中的虚函数去实现,这里委托虚函数的继承来帮忙实现递归;
    3. 借助c函数的函数指针来递归实现;
    4. 借助函数模板去实现。
*/

#include <iostream>
#include <cstdlib>
#include <cstdio>

/* 方法1 */
class Tmp
{
public:
    Tmp(){++N; sum += N;}
    static void reset()
    {
        N = 0;
        sum = 0;
    }

    static long getSum(){return sum;}

private:
    static long N;
    static long sum;
};

long Tmp::N = 0;
long Tmp::sum = 0;

long accumulateSum_v1(long n)
{
    Tmp::reset();
    Tmp*tmp = new Tmp[n];
    delete[] tmp;
    return Tmp::getSum();
}

/* 方法2 */
class A;
A*arrA[2];

class A
{
public:
    virtual long sum(long n)
    {
        return 0;
    }
};

class B : public A
{
public:
    virtual long sum(long n)
    {
        return arrA[!!n]->sum(n-1) + n;
    }
};

long accumulateSum_v2(long n)
{
    A a;
    B b;
    arrA[0] = &a;
    arrA[1] = &b;
    long rst = arrA[1]->sum(n);
    return rst;
}

/* 方法3 */
typedef long (*func) (long);
long solution_1(long n)
{
    return 0;
}

long solution_2(long n)
{
    static func f[2] = {solution_1, solution_2};
    return (n + f[!!n](n-1));
}

long accumulateSum_v3(long n)
{
    return solution_2(n);
}

/* 方法4 */
template<long n>
struct sumStruct_1
{
    enum value{N = sumStruct_1<n-1>::N + n};
};

template<>
struct sumStruct_1<1>
{
    enum value{N = 1};
};

// long accumulateSum_v4(long n)
// {
//     return sumStruct_1<10>::N;
// }

void test_1()
{
    std::cout << "Test 1" << std::endl;
    std::cout << "1+2+3+4+5 = " << accumulateSum_v1(5) << std::endl;
    std::cout << "1+2+3+4+5 = " << accumulateSum_v2(5) << std::endl;
    std::cout << "1+2+3+4+5 = " << accumulateSum_v3(5) << std::endl;
    std::cout << "1+2+3+4+5 = " << sumStruct_1<5>::N << std::endl;
}

void test_2()
{
    std::cout << "Test 2" << std::endl;
    std::cout << "1+2+...+10 = " << accumulateSum_v1(10) << std::endl;
    std::cout << "1+2+...+10 = " << accumulateSum_v2(10) << std::endl;
    std::cout << "1+2+...+10 = " << accumulateSum_v3(10) << std::endl;
    // std::cout << "1+2+...+9 = " << sumStruct_1<9>::N << std::endl;
}

void test_3()
{
    std::cout << "Test 3" << std::endl;
    std::cout << "0 = " << accumulateSum_v1(0) << std::endl;
    std::cout << "0 = " << accumulateSum_v2(0) << std::endl;
    std::cout << "0 = " << accumulateSum_v3(0) << std::endl;
    // std::cout << "0 = " << sumStruct_1<0>::N << std::endl;
}

void test_4()
{
    std::cout << "Test 4" << std::endl;
    std::cout << "1 = " << accumulateSum_v1(1) << std::endl;
    std::cout << "1 = " << accumulateSum_v2(1) << std::endl;
    std::cout << "1 = " << accumulateSum_v3(1) << std::endl;
    // std::cout << "1 = " << sumStruct_1<1>::N << std::endl;
}

void test()
{
    test_1();
    test_2();
    test_3();
    test_4();
}

int main(int argc, char**argv)
{
    test();

    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章