版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/sinat_39088557/article/details/80762593
//自写乘法
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;
}
};