模板编程之技巧(一)
2014-03-12 14:01
204 查看
最近在coolshell上看到这样的一个程序,通过使用模板来求质数序列,感觉挺有意思,于是自己将代码导到自己机子上跑了下,感觉还是不错的,根据这个思想自己回忆起了在找工作时,曾遇到的一个面试题(不能使用乘除法以及循环,求解一个1+2+3+4+5....+N的和),这道题通过使用这个思想同样可以求解,下面我们先来看看coolshell上的这个代码吧,代码如下:
测试结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
2. 面试题代码如下:
测试结果:
sum:5050
3. 逆序打印1-n数,不使用任何的循环语句,代码如下:
测试结果:
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
4. 顺序打印1-n 个数,不能使用任何的循环语句
测试结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
总结
这篇博文主要是看coollshell上面的文章有感而发,感觉这种思想还是蛮有意思,其实很多的简单的算法都可以试着使用模板的方式来实现,这种方式最大的优点就是可以缩小程序的运行时间,但是弊端也是很明显的,其会增加程序的编译时间,至于如何取舍,关键是要看需求了,好了,本篇博文到此结束,多谢。
如果需要,请注明转载,多谢
#include <stdio.h> using namespace std; template<int N,int D = N-1> struct isPrime { enum{ result = (N%D)&&isPrime<N,D-1>::result }; }; template<int N> struct isPrime<N,1> { enum{ result = true }; }; template<int N,bool isprime> struct printIfPrime { static inline void print(){} }; template<int N> struct printIfPrime<N,true> { static inline void print() { printf("%d ",N); } }; template<int N,int MAX> struct printPrimes { static inline void print() { printIfPrime<N,isPrime<N>::result>::print(); printPrimes<N+1,MAX>::print(); } }; template<int N> struct printPrimes<N,N> { static inline void print() { printIfPrime<N,isPrime<N>::result>::print(); } }; int main() { printPrimes<2,100>::print(); printf("\n"); return 0; }
测试结果:
2 3 5 7 11 13 17 19 23 29 31 37 41 43 47 53 59 61 67 71 73 79 83 89 97
2. 面试题代码如下:
#include <stdio.h> using namespace std; template<int N> struct add { enum{ sum = add<N-1>::sum + N }; }; template<> struct add<0> { enum{ sum = 0 }; }; template<int N> struct printSum { static inline void print() { printf("sum:%d\n",add<N>::sum); } }; int main() { printSum<100>::print(); return 0; }
测试结果:
sum:5050
3. 逆序打印1-n数,不使用任何的循环语句,代码如下:
#include <stdio.h> using namespace std; template<int N> struct prints { enum { result = N }; }; template<> struct prints<0> { enum { result = 0 }; }; template<int N> struct printNum { static inline void print() { printf("%d ",prints<N>::result); } }; template<> struct printNum<0> { static inline void print() { printf("%d ",0); } }; template<int N> struct printNumber { static inline void print() { printNum<N>::print(); printNumber<N-1>::print(); } }; template<> struct printNumber<0> { static inline void print() { printNum<0>::print(); } }; int main() { printNumber<20>::print(); printf("\n"); return 0; }
测试结果:
20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
4. 顺序打印1-n 个数,不能使用任何的循环语句
#include <stdio.h> using namespace std; template<int N,int D> struct prints { enum { result = N }; }; template<int N> struct prints<N,0> { enum { result = 0 }; }; template<int N,int D> struct printNum { static inline void print() { printf("%d ",prints<N,D>::result); } }; template<int N> struct printNum<N,0> { static inline void print() { } }; template<int N,int MAX> struct printNumber { static inline void print() { printNum<N,MAX>::print(); printNumber<N+1,MAX-1>::print(); } }; template<int N> struct printNumber<N,0> { static inline void print() { printNum<N,0>::print(); } }; int main() { printNumber<1,20>::print(); printf("\n"); return 0; }
测试结果:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
总结
这篇博文主要是看coollshell上面的文章有感而发,感觉这种思想还是蛮有意思,其实很多的简单的算法都可以试着使用模板的方式来实现,这种方式最大的优点就是可以缩小程序的运行时间,但是弊端也是很明显的,其会增加程序的编译时间,至于如何取舍,关键是要看需求了,好了,本篇博文到此结束,多谢。
如果需要,请注明转载,多谢
相关文章推荐
- [唐胡璐]QTP技巧 - 为描述性编程自动创建注释(Action 模板)
- 模板编程中的技巧
- 2013-04-21 STL之模板编程技巧
- [唐胡璐]QTP技巧 - 为描述性编程自动创建注释(Action 模板)
- 【编程技巧】头文件不能定义全局变量+模板的实现应该头文件中
- 一些基本的编程技巧
- C++模板编程->指针及引用模板参数
- Android编程常用技巧实例总结
- Visual C++ 编程技巧之五和六
- GDI+编程基本技巧
- C++模板编程->分辨重载优先级
- Servlet的一些技巧&模板代码
- Visual Studio技巧之打造拥有自己标识的代码模板
- Java数据库编程中的几个常用技巧
- 编程的奇淫技巧1——尾调用
- iOS5编程--工程和文件模板的研究
- 无插件vim编程技巧
- 程序员编程面试取胜的8个技巧
- 模板编程
- 【观点】在苹果公司学到的编程技巧