20121009记:看了一个帖子,决定记下来,记成word又怕忘了,决定放在这里
原帖连接:http://topic.csdn.net/u/20121004/21/b81b41ff-31f0-453c-848b-6427cc3fd234.html(不是本人的帖子)
注:部分代码为本人添加
题目:
打印 1--1000;
不能使用条件运算符.
不能使用循环语句.
Task:
Print numbers from 1 to 1000 without using any loop or conditional statements. Don't just write the printf() or cout statement 1000 times.
代码:
//--------------------1-构造函数----------------------------//
class Print{
public:
Print(){
std::cout<<++i<<std::endl;
}
private:
static int i;
};
int Print::i = 0;
//int main(){
//
// Print p[1000];
//
// return 0;
//}
//--------------------2-析构函数----------------------------//
class Print2{
public:
~Print2(){
std::cout<<++i<<std::endl;
}
private:
static int i;
};
int Print2::i = 0;
//int main(){
//
// Print2 p[1000];
//
// return 0;
//}
//--------------------3-模版-构造函数----------------------------//
template <int I>
class Print3{
public:
Print3(){
std::cout<<I<<std::endl;
Print3<I+1> p;
p;
}
};
template<>
class Print3<1001>{
};
//int main(){
//
// Print3<1> p;
// return 0;
//}
//--------------------4-模版-析构函数----------------------------//
template <int I>
class Print4{
public:
Print4(){
Print4<I-1> p;
p;
}
~Print4(){
std::cout<<I<<std::endl;
}
};
template<>
class Print4<0>{
};
//int main(){
//
// Print4<1000> p;
// return 0;
//}
//--------------------5-宏定义----------------------------//
#define Out(i) printf("%d\n", i++);
#define REP(N) N N N N N N N N N N
#define Out1000(i) REP(REP(REP(Out(i))));
//void main()
//{
// int i = 1;
// Out1000(i);
//}
//--------------------6-与运算符----------------------------//
void print()
{
static int i = 1;
(i - 1001) && (printf("%d ", i++)) && (print(), 0); //这不算条件运算符吗?如不算,那么用三目运算符也可以吧!
}
//int main(){
//
// print();
// return 0;
//}
//--------------------7-递归----------------------------//
void print2(int i){
std::cout<<i<<std::endl;
(1000-i)?print2(i+1):1;
}
//int main(){
//
// print2(1);
// return 0;
//}
//--------------------8-一位网友的原话----------------------------//
//这类题大体有两种
//-1-//一种是禁用某种语法元素的,比如这一题,通常会禁用循环、条件、以及某些运算符,通常的方法是递归或利用某些“自动执行”的语法特性(如构造函数),这种题你就别考虑时空效率了,达成要求就是答题成功,几乎肯定比直观方法慢,因为就是在玩语法,根本不涉及算法改进
//-2-//另一种是禁用变量或限制变量,某些时候有一定意义,让程序员养成紧凑的编码习惯,现实中滥用变量的程序员很多,所以那种“只许用一个变量,完成XXX”的题基本还能看看,而限制过死又成了烂题,比如“不用变量,交换数据”,美其名曰“节省空间”,而事实上再弱的嵌入式也不在乎多声明几个整数,你真正需要注意的是数组和递归,而且,用变量也不一定浪费空间,arm、sparc、x64这些寄存器比较多的CPU,变量实际上是很可能被优化到寄存器里的,寄存器较少的x86的原则也是优先使用寄存器,而且编译器的优化能力几乎就是最佳方案(所以register关键字基本没用)