您的位置:首页 > 职场人生

面试题50:求1+2+...+n

2016-01-13 18:10 459 查看
题目:

求1+2+...+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。

思路:

或许你想到了n(n+1)/2,可是不能用乘除法啊,坑~

然后你想到了递归,可是不能用if终止递归,坑~

思路一:用构造函数求解

不能循环n次,但是我们可以创建n个实例,这样相同的代码就会被执行n次。

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <algorithm>
#include <hash_set>  //for hashtable
#include <hash_map>
#include <unordered_map>
#include <set>
#include <ctime>
using namespace std;

class Temp{
public:
Temp(){ ++N; sum += N; }
static void Reset(){ N = 0; sum = 0; }
static 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(unsigned int n)
{
Temp *temp = new Temp
;
delete[]temp;
return Temp::GetSum();
}

int main()
{
cout << Sum(100) << endl;
return 0;
}


注意:每个static数据成员可以看成是类的一个对象,而不与该类定义的对象有任何关系!

思路二:利用虚函数求解

对n连续做两次反运算,那么非0的n转为true,0转为false。

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <algorithm>
#include <hash_set>  //for hashtable
#include <hash_map>
#include <unordered_map>
#include <set>
#include <ctime>
using namespace std;

class A;
A* array[2];  //class中要用到
class A{
public:
virtual unsigned int GetSum(unsigned int n)
{
return 0;
}
};

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

unsigned int Sum(unsigned int n)
{
A a;
B b;
array[0] = &a;
array[1] = &b;
return array[1]->GetSum(n);
}

int main()
{
cout << Sum(100) << endl;
return 0;
}
这种思路是用虚函数来实现函数的选择。

思路三:利用函数指针求解

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <algorithm>
#include <hash_set>  //for hashtable
#include <hash_map>
#include <unordered_map>
#include <set>
#include <ctime>
using namespace std;

typedef unsigned int(*fun)(unsigned int);
unsigned int Sum(unsigned int n);
unsigned int SumTeminator(unsigned int n);

fun f[2] = { SumTeminator, Sum }; //函数数组初始化

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

unsigned int Sum(unsigned int n)
{
return n + f[!!n](n - 1);
}

int main()
{
cout << Sum(100) << endl;
return 0;
}


思路四:利用模板类型求解

可以让编译器帮助完成类似于递归的计算。

#include <iostream>
#include <vector>
#include <queue>
#include <string>
#include <stack>
#include <algorithm>
#include <hash_set>  //for hashtable
#include <hash_map>
#include <unordered_map>
#include <set>
#include <ctime>
using namespace std;

template<unsigned int n> struct Sum
{
enum Value{ N = Sum<n - 1>::N + n };
};
template<> struct Sum<1>  //特化
{
enum Value{ N = 1 };
};

int main()
{

cout << Sum<100>::N << endl;
return 0;
}
cout << Sum<100>::Value::N << endl; //这样调用也可以
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: