求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;
    }
};



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值