(剑指Offer)面试题46:求1+2+3+....+n

题目:

求1+2+3+...+n,要求不能使用乘除法,for,while,if,else,switch,case等关键字及条件判断语句(a?b:c)。

思路:

1、构造函数

在类中定义静态成员变量N和sum,在构造函数中++N,sum+=N;如此一来,创建n个该类型的实例,就会调用n次构造函数,对应的静态变量也就随着更新。

2、虚函数

使用递归时,既然不能再一个函数中判断是不是终止递归,那么不妨定义两个函数,一个函数充当递归函数,一个负责处理递归的结束条件;

需要解决的问题就是如何在两个函数中二选一,自然是通过bool变量。如果对n连续做两次反运算,即!!n,那么非零的n转换为true,0转换为false。

3、函数指针

在纯C语言中,不能使用虚函数,此时可以使用函数指针来模拟。

4、模板类型

让编译器帮助完成类似于递归的计算。

代码:

1、构造函数

#include <iostream>

using namespace std;

class Sum{
public:
    Sum(){ ++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 Sum::N=0;
unsigned int Sum::sum=0;

unsigned int Sum_Solution(unsigned int n){
    Sum::Reset();
    Sum* a=new Sum[n];
    delete[] a;
    a=NULL;

    return Sum::getSum();
}

int main()
{
    cout << Sum_Solution(100) << endl;
    return 0;
}

2、虚函数

class A;
A* array[2];

class A{
public:
    virtual unsigned int Sum(unsigned int n){
        return 0;
    }
};

class B: public A{
public:
    virtual unsigned int Sum(unsigned int n){
        return array[!!n]->Sum(n-1)+n;
    }
};

unsigned int Sum_Solution(unsigned int n){
    A a;
    B b;
    array[0]=&a;
    array[1]=&b;

    int sum=array[1]->Sum(n);
    return sum;
}

int main(){
    int n=100;
    cout << Sum_Solution(n) << endl;
}

3、函数指针

typedef unsigned int (*fun)(unsigned int);

unsigned int Solution_Terminator(unsigned int n){
    return 0;
}

unsigned int Sum_Solution(unsigned int n){
    static fun f[2]={Solution_Terminator,Sum_Solution};
    return n+f[!!n](n-1);
}

int main(){
    int n=100;
    cout<< Sum_Solution(n)<< endl;
}

在线测试OJ:

http://www.nowcoder.com/books/coding-interviews/7a0da8fc483247ff8800059e12d7caf1?rp=2

AC代码:

class Sum{
public:
    Sum(){ ++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 Sum::N=0;
unsigned int Sum::sum=0;

class Solution {
public:
    int Sum_Solution(int n) {
        Sum::reset();
        Sum* a=new Sum[n];
        delete[] a;
        a=NULL;

        return Sum::getSum();
    }
};

 

posted @ 2015-07-30 21:03  AndyJee  阅读(1175)  评论(0编辑  收藏  举报