zoukankan      html  css  js  c++  java
  • Chap6: question 46

    46. 求 1+2+ … +n。

    要求:不用乘除法、for、while、if、else、switch、case 以及条件判断语句(A?B:C)。

    a. 利用构造函数求解

    #include <iostream>
    using namespace std;
    
    class Sum{
    public:
        Sum() {++n; sum += n;}
        static void reset() {sum = n = 0;}
        static int getSum(){ return sum;}
    private:
        static int n;
        static int sum; 
    };
    int Sum::n = 0;
    int Sum::sum = 0;
    
    int solution(int n)
    {
        Sum::reset();
        Sum *p = new Sum[n];
        delete[] p;
        return Sum::getSum();
    }
    
    int main()
    {
        cout << solution(100) << endl;
        cout << solution(1000) << endl;
        cout << solution(100) << endl;
        return 0;
    }
    
    b. 利用虚函数函数指针求解
    #include <iostream>
    using namespace std;
    class Base;
    class Base* A[2];
    class Base{
    public:
        virtual int sum(int n) { return 0; }
    };
    class Dirived: public Base{
    public:
        int sum(int n)
        {
            return A[!!n]->sum(n-1) + n;
        }
    };
    int main()
    {
        A[0] = new Base;
        A[1] = new Dirived;
    
        cout << A[1]->sum(100) << endl;
        cout << A[1]->sum(1000) << endl;
        cout << A[1]->sum(100) << endl;
        return 0;
    }
    
    
    利用函数指针
    #include <iostream>
    using namespace std;
    
    typedef int (*F)(int n);
    F A[2];  
    int fun1(int n)
    {
        return 0;
    }
    int fun2(int n)
    {
        return A[!!n](n-1) + n;
    }
    
    int main()
    {
        A[0] = fun1;
        A[1] = fun2;
        cout << A[1](100) << endl;
        cout << A[1](1000) << endl;
        cout << A[1](100) << endl;
        return 0;
    }
    
    c. 利用模板类型和枚举类型求解(编译器完成工作)
    #include <iostream>
    using namespace std;
    
    template<size_t N>class A{
    public:
        enum { N = A<N-1>::N + N};
    }; 
    
    template<>class A<1>{
    public:
        enum { N = 1};
    };
    
    int main()
    {
        const int n = 100;
        cout << A<n>::N << endl;
        cout << A<500>::N << endl;
    /*    cout << A<1000>::T.N << endl;*/  // not support too long like 1000
        return 0;
    }
    

    47. 不用 +、-、*、/ 做加法

    GO: 奇妙的数学 -> 3.不用加减乘除求两个整数的和

    48. 不能被继承的类

    有缺陷的方法1:

    class A{
    public:
        static A* getInstance() { return new A; }
        static void deleteInstance(A *rhs)  { delete[] rhs;}
    private:
        A(){}
        ~A(){}
    };
    

    缺点:使用麻烦,且只能得到位于堆上的实例。

    方法2:利用虚拟继承。

    template<typename T>class Help
    {
        friend T;
    private:
        Help(){}
        ~Help(){}
    };
    class A : virtual public Help<A>
    {
    public:
        A(){}
        ~A(){}
    };
    

    如上,类 A 可以很方便的声明对象; 同时它是虚拟继承,故若有类继承它,则直接调动 Help 构造函数,导致编译失败。

    注: GCC不支持模版参数类型作为友元类型。

  • 相关阅读:
    CAAnimation动画相关文章
    [源代码]List的增加与删除
    [原创]c# 类中 Collection 字段初始化的特殊之处
    c# 多数值区间判断是否有重叠
    将M个客服随机分配给N个客户
    c# IList.ToList()后更改元素值会不会影响原列表的值
    java单元测试之Mock静态方法
    java的Spring学习2- junit和mock
    java mybatis学习二
    java8 方法引用与lambda
  • 原文地址:https://www.cnblogs.com/liyangguang1988/p/3707752.html
Copyright © 2011-2022 走看看