/*******************************************************************
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;
}