面试题46: 使用构造函数和函数指针完成加法求和

来源:互联网 发布:日系女装 知乎 编辑:程序博客网 时间:2024/05/20 09:07
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;}


0 0
原创粉丝点击