使用构造函数和函数指针完成加法求和

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

1.题目,求1+2+3+......+n,要求不能使用乘除法,for,while,if,else、switch、case等关键字及条件判断语句(A?B:C).
分析:
构造函数的方法,定义一个类型,接着创建该类型的n个实例,则该类型的构造函数会被调用n次,可以将累加的代码放在构造函数里。每次都会被调用。

函数指针的方法,可以采用递归的方法,但是限定了if的使用,递归的进行和终止只能用其他的方法来实现,可以写两个函数,一个用来递归,另一个来终止递归,当适当的时候,选择不同的函数,这就需要一个指示变量,可以用布尔变量,两个不同的取值对应两个不同的函数。将数值n转换成布尔值,可以采用!!n的方式,n非零的时表达式是true,n为0时表达式的值是false。

// Sum_solution1.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#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();
}


int main(int argc, char* argv[])
{
    unsigned int sum=Sum_Solution1(100);
    printf("%u\n",sum);
    return 0;
}
/*
5050
Press any key to continue
*/

 

// Sum_Solution2.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
using namespace std;

// ====================方法二====================
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是调用第一个函数终止递归

    fun funptr=(n>0)?Sum_Solution2:Solution2_Teminator;
    return n+funptr(n-1);
}

int main()
{
    int i=0;
    cout<<!!i<<endl;
    i=-1;
    cout<<!!i<<endl;
    i=-2;
    cout<<!!i<<endl;
    i=1;
    cout<<!!i<<endl;
    i=2;
    cout<<!!i<<endl;

    unsigned int number = 100;
    //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
1
1
1
1
----solution 2----
the sum of 100 is :5050
请按任意键继续. . .
*/

 

posted @ 2017-05-03 10:49  sky20080101  阅读(449)  评论(0编辑  收藏  举报