题目:用C/C++计算1+2+3+……N
条件:
1.不使用任何循环语句。(for,while,goto等等)
2.不使用任何条件语句。(if,?:等等)
3.不使用*/等运算,只使用+-运算
4:更不能写1000个printf或是cout。
一看到这个题,人们会想到递归,但是递归需要结束条件,题目要去不要任何判断条件,所以不行。
例一:变相的用1000个printf
- #include<stdio.h>
- #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( out(i) )) ;
- int main(int argc,char *argv[])
- {
- int i=1;
- Out100(i);
- return 0;
- }
这个方法的宏定义用的很巧妙,实际上是用了1000个printf,但是在题目中没出现。这个有打擦边球的嫌疑,算是一种方法。
例二:用类构造函数和静态变量
- #include<iostream>
- using namespace std;
- class NSum
- {
- public:
- NSum()
- {
- static unsigned sum =1;
- cout<<sum++<<endl;
- }
- };
- int main(int argc, char ** argv)
- {
- NSum s[100];
- return 0;
- }
这个巧妙的用到了,类的构造函数和静态变量概念。每次NSum被调用,构造函数就把sum加1,并且静态变量会保存这个修改。利用数组类,免去了重复输入1-N很巧妙。可以达到目的。
例三:用模板类
- #include<iostream>
- using namespace std;
- template<int N>
- struct NumberGeneration
- {
- static void out(std::ostream &os)
- {
- NumberGeneration<N -1>::out(os);
- os<<N<<std::endl;
- }
- };
- template<>
- struct NumberGeneration<1>
- {
- static void out(std::ostream &os)
- {
- os<<1<<std::endl;
- }
- };
- int main(int argc,char ** argv)
- {
- NumberGeneration<100>::out(std::cout);
- return 0;
- }