zoukankan      html  css  js  c++  java
  • (剑指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();
        }
    };
  • 相关阅读:
    协方差矩阵
    Adobe Photoshop CS6下载安装
    等差数列
    照片产尺寸
    移动立方体算法
    float与double的范围和精度
    C/C++运算符优先级
    通过 Windows API 获取鼠标位置等状态信息
    VC++ 获取鼠标状态,获取鼠标弹起消息
    python动态给对象或者类添加方法
  • 原文地址:https://www.cnblogs.com/AndyJee/p/4690591.html
Copyright © 2011-2022 走看看