求1+2+…+n,要求不能使用乘除法、for、while、if、else、switch、case等关键字以及条件判断语句(A?B:C)。
以下是三种方法,主要原理
就是以其他的方法来实现循环,或者是递归。
这里面比较巧妙的用到了构造函数,数组,全局变量。
还有就是在不用if的情况下来构造true(1) false(0)
!!n是一个很好的性质。
下面的代码可以在dev c++直接使用。
#include
using namespace std;
//方法一:用全局变量和构造函数 ;
class Temp
{
public:
Temp() { ++ N; Sum += N; }
static void Reset() { N = 0; Sum = 0; }
static int GetSum() { return Sum; }
private:
static int N;
static int Sum;
};
int Temp::N = 0;
int Temp::Sum = 0;
int solution1_Sum(int n)
{
Temp::Reset();
Temp *a = new Temp[n];
delete []a;
a = 0;
return Temp::GetSum();
};
//方法二:采用递归,但是递归是要if的,肿么办捏?那我们那构造if
//比如ture(1)的时候调用第一个函数,false(0)的时候调用第二个函数。
//那现在的问题是如和把数值变量n转换成布尔值。
//如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。
class A;
A* Array[2];
class A
{
public:
virtual int Sum (int n) { return 0; }
};
class B: public A
{
public:
// int Array[n];
virtual int Sum (int n) { return Array[!!n]->Sum(n-1)+n; }
};
int solution2_Sum(int n)
{
A a;
B b;
Array[0] = &a;
Array[1] = &b;
int value = Array[1]->Sum(n);
return value;
}
//方法三:函数指针数组
typedef int (*fun)(int);
int solution3_f1(int i)
{
return 0;
}
int solution3_f2(int i)
{
fun f[2]={solution3_f1, solution3_f2};
return i+f[!!i](i-1);//注意这里f[!!i](i-1)不是 f[!!i]*(i-1)的意思,是传的参数i-1
}
int main(){
int n=10;
int sum=0;
sum=solution1_Sum(n);
cout<<"solution_1 sum="<