C/C++面试题系列之3:输出1-N个数字

34 篇文章 0 订阅
32 篇文章 0 订阅

题目:用C/C++计算1+2+3+……N
条件:
1.不使用任何循环语句。(for,while,goto等等)
2.不使用任何条件语句。(if,?:等等)
3.不使用*/等运算,只使用+-运算 

4:更不能写1000个printf或是cout。 

 

一看到这个题,人们会想到递归,但是递归需要结束条件,题目要去不要任何判断条件,所以不行。

例一:变相的用1000个printf

[cpp]  view plain copy
  1. #include<stdio.h>  
  2. #define out(i) printf("%d/n",i++) ;  
  3. #define REP(N) N N N N N N N N N N  
  4. #define Out1000(i) REP( REP( out(i) )) ;  
  5. int main(int argc,char *argv[])  
  6. {  
  7.     int i=1;  
  8.     Out100(i);  
  9.     return 0;  
  10. }  
 

 

这个方法的宏定义用的很巧妙,实际上是用了1000个printf,但是在题目中没出现。这个有打擦边球的嫌疑,算是一种方法。

 

例二:用类构造函数和静态变量

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3. class NSum  
  4. {  
  5.     public:  
  6.      
  7.     NSum()  
  8.     {  
  9.         static unsigned sum =1;  
  10.         cout<<sum++<<endl;  
  11.     }  
  12. };  
  13. int main(int argc, char ** argv)  
  14. {  
  15.     NSum s[100];  
  16.     return 0;  
  17. }  
 

 

这个巧妙的用到了,类的构造函数和静态变量概念。每次NSum被调用,构造函数就把sum加1,并且静态变量会保存这个修改。利用数组类,免去了重复输入1-N很巧妙。可以达到目的。

 

例三:用模板类

[cpp]  view plain copy
  1. #include<iostream>  
  2. using namespace std;  
  3. template<int N>  
  4. struct NumberGeneration  
  5. {  
  6.     static void out(std::ostream &os)  
  7.     {  
  8.         NumberGeneration<N -1>::out(os);  
  9.         os<<N<<std::endl;  
  10.     }  
  11. };  
  12. template<>  
  13. struct NumberGeneration<1>  
  14. {  
  15.     static void out(std::ostream &os)  
  16.     {  
  17.          
  18.         os<<1<<std::endl;  
  19.     }  
  20. };  
  21. int main(int argc,char ** argv)  
  22. {     
  23.     NumberGeneration<100>::out(std::cout);  
  24.     return 0;  

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值