忘记了在哪里转载的了。。。
问题:1+2+3+..+n,不能使用if,else,while等
1、构造函数方法
class Sum{
public:
static int m,sum;
sum(){
sum+=m;
m++;
}
}
int Sum::m=1;
int Sun::sum=0;
int main(){
n=10;
Sum a[10];
cout<<a[0].sum<<endl;
}
2、利用逻辑运算符的短路特性
int sum(int n,int &m){
n&&sum(n-1,m);
return m+=n;
}
int main(){
int n=10;
cout<<sum(n,m);
}
3、利用模板元编程实现
//主模板
template<int N>
class num{
public:
enum{value=N+num<N-1>::value};
}
//特化模板
template<>
class num<1>{
public:
enum{value=1};
}
int main(){
const int m=10;
cout<<num<10>::value<<endl;
}
注意一下元模板的思想
1、模板元程序则由编译器在编译期解释执行、以编译耗时为代价换来卓越的运行期性能
2、代码可读性差,可移植性较差,调试困难,编译时间长
3、模板元编程中不可以使用变量,我们只能使用typedef名字和整型常量。这和第一点有关
4、利用指针函数
//声明指针函数
typedef int (*fun)(int value);
fun pfun[2];
int getSum1(int value){
return 0;
}
int getSum2(int value){
return (*pfun[!!value])(value-1)+value//只有在value=0下,!!value才会等于0,其余情况下(包括负数),都是值为1
}
int getValue(int value){
pfun[0]=getSum1;
pfun[1]=getSum2;
int sum=getSum2(value);
return sum;
}
int main(){
int n;
cin>>n;
cout<<getValue(n)<<endl;
}
8、利用虚函数
class num;
num *pnum[2];
class num{
public :
virtual int getSum(int value){return 0;}
};
class sub:public num
{
public int getSum(int value){return pnum[!!value]->getSum(value-1)+value;}
};
int getValue(int value){
num objnum;
sub objsub;
pnum[0]=&objnum;
pnum[1]=&objsub;
int result=pnum[1]->getSum(value);
//利用虚函数的特性,当paNum[1]为0时,即paNum[0] = &objNum; 执行C_Num::GetSum,
//当Array[1]不为0时, 即paNum[1] = &objNumEx; 执行C_NumEx::GetSum。
return result;
}
int main(){
cin n;
cin>>n;
cout<<getValue(n)<<endl;
return 0;
}