1.题目,求1+2+3+......+n,要求不能使用乘除法,for,while,if,else、switch、case等关键字及条件判断语句(A?B:C).
分析:
构造函数的方法,定义一个类型,接着创建该类型的n个实例,则该类型的构造函数会被调用n次,可以将累加的代码放在构造函数里。每次都会被调用。
函数指针的方法,可以采用递归的方法,但是限定了if的使用,递归的进行和终止只能用其他的方法来实现,可以写两个函数,一个用来递归,另一个来终止递归,当适当的时候,选择不同的函数,这就需要一个指示变量,可以用布尔变量,两个不同的取值对应两个不同的函数。将数值n转换成布尔值,可以采用!!n的方式,n非零的时表达式是true,n为0时表达式的值是false。
源码:
/*
* \file question_46.cpp
*
* \author 305
* \date 十月 2016
*
*
*/
#include <iostream>
using namespace std;
// ====================方法一====================
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[n];
delete[]a;
a = NULL;
return Temp::GetSum();
}
// ====================方法二====================
typedef unsigned int(*fun)(unsigned int);
unsigned int Solution2_Teminator(unsigned int n)//终止递归
{
return 0;
}
unsigned int Sum_Solution2(unsigned int n)//递归
{
static fun f[2] = { Solution2_Teminator, Sum_Solution2 };
return n + f[!!n](n - 1);//!!n的含义就是转化成布尔值,调用第一个或者第二个函数指针指向的函数,n大于0时递归,n为0是调用第一个函数终止递归
}
int main()
{
unsigned int number = 10;
cout << "----solution 1----" << endl;
unsigned int result1 = Sum_Solution1(number);
cout << "the sum of " << number << " is :" << result1 << endl;
cout << "----solution 2----" << endl;
unsigned int result2 = Sum_Solution2(number);
cout << "the sum of " << number << " is :" << result2 << endl;
system("pause");
return 0;
}