您的位置:首页 > 其它

求1+2+3+4+++++++n

2016-03-13 15:22 190 查看
要求不能使用for、while、if、else、switch、case等关键字,以及条件判断语句(A?B:C)

方法一:我们可以用构造函数来完成这个事情,我们为了一个类创建n个对象,设置一个类的静态变量,用new分配内存(因为new自动调用构造函数)

方法二:我们可以用虚函数来求解,定义两个函数,一个函数充当递归函数的角色,另一个函数处理终止递归的情况,我们需要做的就是在这两个函数里面二选一,当值不为0时,调用a函数,为0时调用b函数,我们可以很容易想到!!用两次取反来实现。

方法三:在纯c语言的编程环境中,我们不能使用虚函数,此时可以用函数指针来模拟,这样的代码可能更直观一些!!!

其中typedef unsigned int (*func) (unsigned int)  这是一个函数指针的宏,返回类型为unsignd int 参数为unsigned int   函数名为func。

// Accumulate.cpp : Defines the entry point for the console application.
//

// 《剑指Offer——名企面试官精讲典型编程题》代码
// 著作权所有者:何海涛

#include "stdafx.h"

// ====================方法一====================
class Temp
{
public:
Temp() { ++ N; Sum += N; }

static void Reset() { N = 0; Sum = 0; }
static unsigned int GetSum() { return Sum; }

private:
static unsigned int N;
static unsigned int Sum;
};

unsigned int Temp::N = 0;
unsigned int Temp::Sum = 0;

unsigned int Sum_Solution1(unsigned int n)
{
Temp::Reset();

Temp *a = new Temp
;
delete []a;
a = NULL;

return Temp::GetSum();
}

// ====================方法二====================
class A;
A* Array[2];

class A
{
public:
virtual unsigned int Sum (unsigned int n)
{
return 0;
}
};

class B: public A
{
public:
virtual unsigned int Sum (unsigned int n)
{
return Array[!!n]->Sum(n-1) + n;
}
};

int Sum_Solution2(int n)
{
A a;
B b;
Array[0] = &a;
Array[1] = &b;

int value = Array[1]->Sum(n);

return value;
}

// ====================方法三====================
typedef unsigned int (*fun)(unsigned int);

unsigned int Solution3_Teminator(unsigned int n)
{
return 0;
}

unsigned int Sum_Solution3(unsigned int n)
{
static fun f[2] = {Solution3_Teminator, Sum_Solution3};
return n + f[!!n](n - 1);
}

// ====================方法四====================
template <unsigned int n> struct Sum_Solution4
{
enum Value { N = Sum_Solution4<n - 1>::N + n};
};

template <> struct Sum_Solution4<1>
{
enum Value { N = 1};
};

template <> struct Sum_Solution4<0>
{
enum Value { N = 0};
};

// ====================测试代码====================
void Test(int n, int expected)
{
printf("Test for %d begins:\n", n);

if(Sum_Solution1(n) == expected)
printf("Solution1 passed.\n");
else
printf("Solution1 failed.\n");

if(Sum_Solution2(n) == expected)
printf("Solution2 passed.\n");
else
printf("Solution2 failed.\n");

if(Sum_Solution3(n) == expected)
printf("Solution3 passed.\n");
else
printf("Solution3 failed.\n");
}

void Test1()
{
const unsigned int number = 1;
int expected = 1;
Test(number, expected);
if(Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
}

void Test2()
{
const unsigned int number = 5;
int expected = 15;
Test(number, expected);
if(Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
}

void Test3()
{
const unsigned int number = 10;
int expected = 55;
Test(number, expected);
if(Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
}

void Test4()
{
const unsigned int number = 0;
int expected = 0;
Test(number, expected);
if(Sum_Solution4<number>::N == expected)
printf("Solution4 passed.\n");
else
printf("Solution4 failed.\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
Test1();
Test2();
Test3();
Test4();

return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: