题目描述:求1+2+3+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句(A?B:C)。
本题主要是想考察应聘者的发散思维,以及编程技术的宽度,在实际开发过程中不会有这样苛刻的限制。我们来提供一下几种思路解决本题:
- 利用数学公式
int sum_solution1(int n)
{
bool a[n][n + 1];
return sizeof(a) >> 1;
}
这个思路是基于1+2+……+n的数学公式是(n+(n+1))/2
- 利用逻辑与的短路特性实现递归终止
int sum_solution2(int n)
{
int sum = 0;
bool ans = (n > 0) && ((sum += sum_solution(n - 1)) > 0);
return sum;
}
1.当n == 0时,(n>0) && ((sum += Sum_Solution(n - 1))>0)只执行前面的判断,为false,然后直接返回0;
2.当n>0时,执行sum += Sum_Solution(n - 1),实现递归计算Sum_Solution(n)。
上面的两种方法其实有些投机取巧,实际上按照严格要求并不完全符合题意(但是可以编译过哦,在面试中可以先给面试官写这两种方法,如果面试官还不满意)下面再介绍四种比较稳妥的方法!
- 利用构造函数求解
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_solution3(unsigned int n)
{
Temp::Reset();
Temp* a = new Temp[n];
delete[] a;
a = NULL;
return Temp::Getsum();
}
思路:定义一个类型,然后再创建n个该类型的实例,那么该类型的构造函将会被调用n次。
- 利用虚函数求解
class A;
A* arr[2];
class A
{
public:
vritual unsigned int Sum(unsigned int n)
{
return 0;
}
};
class B :public A
{
public:
vritual unsigned int Sum(unsigned int n)
{
return arr[!!n]->Sum(n);
}
};
int Sum_solution4(int n)
{
A a;
B b;
arr[0] = &a;
arr[1] = &b;
int value = arr[1]->Sum(n);
return value;
}
思路:
1.定义两个函数,一个函数充当递归函数,一个函数用来处理递归终止的情况,在操作时,我们只需要在两个函数里面任意选择一个即可,因此用bool类型。
2.true(1)时,调用第一个函数,false(0)时,调用第二个函数。
3.对n连续两次做反运算,即!!n,则非零的n转换为true,零转换为false。
- 利用函数指针求解
typedef unsigned int(*fun)(unsigned int);
unsigned int Solution(unsigned int n)
{
return 0;
}
unsigned int sum_solution5(unsigned int n)
{
static fun f[2] = { Solution, sum_solution5 };
return n + f[!!n](n - 1);
}
不使用虚函数时,即C语言中用函数指针来模拟。
- 利用模板类型求解
template <unsigned int n> struct Sum_Solution6
{
enum Value
{N = Sum_Solution6<n-1>::N+n};
};
template <> struct Sum_Solution6<1>
{
enum Value{N=1};
};

本文探讨了在不使用循环与条件语句的情况下求1到n的和的方法,包括利用数学公式、逻辑与短路特性实现递归、构造函数、虚函数及函数指针等多种创新思路。

1310

被折叠的 条评论
为什么被折叠?



