劍指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;
}

 

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