求1+2+3+...+n,要求不能使用乘除法、for、while、if、else、switch、case等關鍵字及條件判斷語句(A?B:C)

//自寫乘法
class Solution{
public:
    //利用ab = a/2·2b的性質
    int multi(int a, int b){
        int res = 0;
        (a&1) && (res += b);//如果a是奇數,那麼除以2之後,再乘以2,會少1,所以在res上先補1個b
        a >>= 1; 
        b <<=1;//a除以2,b乘以2
        a && (res += multi(a, b));//如果a不是0,執行a/2·2b的操作
        return res;
    }
    int Sum_Solution(int n){
        return multi(n,n+1)>>1;
    }
};

//構造函數法

class Calculator{
    static int N;
    static int sum;
public:
    static int getSum(){return sum;}
    static void resetNum(){N=sum=0;}
    Calculator(){sum += ++N;}
};
int Calculator::N = 0;
int Calculator::sum = 0;
class Solution {
public:
    int Sum_Solution(int n) {
        if(n<1) return -1;
        Calculator::resetNum();
        Calculator* temp = new Calculator[n];
        delete[] temp;
        return Calculator::getSum();
    }
};


//虛函數法
class Base;
Base* B[2];


class Base{
public:
    virtual int getSum(int){return 0;}
};
class Derived:public Base{
    int getSum(int n){return B[!!n]->getSum(n-1)+n;}
};
class Solution{
public:
    int Sum_Solution(int n){
        if(n<1) return -1;
        Base b;
        Derived d;
        B[0] = &b;
        B[1] = &d;
        return B[1]->getSum(n);
    }
};


//函數指針法
typedef int (*pSumFun)(int n);
int sumFinal(int);
int sum(int n);
pSumFun funs[2]={sumFinal,sum};
int sumFinal(int){return 0;}
int sum(int n){return n+funs[!!n](n-1);}
class Solution{
public:
    int Sum_Solution(int n){
        if(n<1) return -1;
        return funs[1](n);
    }
};


//模板類型法(VS2013上可以通過)
template<unsigned int n>
struct solution{
    enum Value{N = solution<n-1>::N + n};
};
template<>//顯式聲明特例
struct solution<0>{
    enum Value{N=0};
};
class Solution{
public:
    int Sum_Solution(int n){
        const unsigned int num = n;
        return solution<num>::N;
    }
};


//邏輯短路法
class Solution{
public:
    int Sum_Solution(int n){
        int res=0;
        n && (res += Sum_Solution(n-1) + n);
        return res;
    }
};



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章