《剑指offer》:[46]求1+2+3+...+n
2016-06-25 11:38
585 查看
题目:求1+2+3+4+.....+n,要求不能使用除法,for,while,if,else,switch,case等关键字及条件判断语句(A?B:C)。
看似一些不可能的问题,主要是考察我们的发散思维的能力,发散思维的特点是思维活动的多向性和变通性,也就是我们在思考问题时注重运用多思路、多方案、多途径第解决问题。像1+2+3+...+n的解决方法关键就在找到不用上述关键字如何实现递归和循环!
方案一:公式法。n(1+n)/2。这里不再多说,不是我们想要的结果。
方案二:利用构造函数来求解(基于循环的思路)。循环就是让代码重复的执行N遍而已,所以我们也可以用其他的方法来达到这个效果。这里我们可以先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数就会执行n遍,我们可以将与累加相关的代码放在构造函数里。
方案三:利用虚函数来求解(基于递归思路)。由于一个函数可以实现加法,但是还需要一个函数来实现循环和判断终止。所以这里我们定义两个函数,一个函数充当递归函数的角色实现循环,另一个函数处理终止递归的情况,我们需要做的就是在这两个函数里二选一。二选一的时候我们当然会想到bool类型。
这里有一个技巧,对一个整形的不为0的数n,!n=0(false),两次取反!!n=1(true)。这样的话我们就可以实现循环和终止的条件了。
方案四:利用函数指针来求解。其实这个思路和方案三比较类似。只不过把可以选择调用的虚函数该为了两个函数,调用更加简单直接了而已。
方案五:利用模板类型来求解,完成类似于递归的计算。
方案一:公式法
运行结果:
方案三:虚函数
方案四:函数指针(类似方案三)
看似一些不可能的问题,主要是考察我们的发散思维的能力,发散思维的特点是思维活动的多向性和变通性,也就是我们在思考问题时注重运用多思路、多方案、多途径第解决问题。像1+2+3+...+n的解决方法关键就在找到不用上述关键字如何实现递归和循环!
方案一:公式法。n(1+n)/2。这里不再多说,不是我们想要的结果。
方案二:利用构造函数来求解(基于循环的思路)。循环就是让代码重复的执行N遍而已,所以我们也可以用其他的方法来达到这个效果。这里我们可以先定义一个类型,接着创建n个该类型的实例,那么这个类型的构造函数就会执行n遍,我们可以将与累加相关的代码放在构造函数里。
方案三:利用虚函数来求解(基于递归思路)。由于一个函数可以实现加法,但是还需要一个函数来实现循环和判断终止。所以这里我们定义两个函数,一个函数充当递归函数的角色实现循环,另一个函数处理终止递归的情况,我们需要做的就是在这两个函数里二选一。二选一的时候我们当然会想到bool类型。
这里有一个技巧,对一个整形的不为0的数n,!n=0(false),两次取反!!n=1(true)。这样的话我们就可以实现循环和终止的条件了。
方案四:利用函数指针来求解。其实这个思路和方案三比较类似。只不过把可以选择调用的虚函数该为了两个函数,调用更加简单直接了而已。
方案五:利用模板类型来求解,完成类似于递归的计算。
方案一:公式法
int Sum(int n) { return n*(n+1)/2; }方案二:构造函数
#include <iostream> using namespace std; class Sum { public: Sum() { n++; sum+=n; } static void Reset() { sum=0; n=0; } static int getResult() { return sum; } private: static int sum; static int n; }; int Sum::sum=0; int Sum::n=0; int Sum2(int n) { Sum::Reset(); Sum *s=new Sum ; delete []s; s=NULL; return Sum::getResult(); } int main() { int result=Sum2(100); cout<<"1+2+3+...+100: "<<result<<endl; system("pause"); return 0; }
运行结果:
方案三:虚函数
#include <iostream> using namespace std; class Father; Father *ff[2]; class Father { public: virtual int Sum(int n) { return 0; } }; class Son:public Father { public: int Sum(int n) { return ff[!!n]->Sum(n-1)+n; } }; int main() { Father f; Son s; ff[0]=&f; ff[1]=&s; int result=ff[1]->Sum(100); cout<<"虚函数:1+2+3+...+100: "<<result<<endl; system("pause"); return 0; }运行结果:
方案四:函数指针(类似方案三)
#include <iostream> using namespace std; typedef int (*FUN)(int n); int function1(int n) { return 0; } int function2(int n) { static FUN f[2]={function1,function2};//用函数地址为其初始化; return n+f[!!n](n-1); } int main() { int result=function2(100); cout<<"函数指针:1+2+3+...+100: "<<result<<endl; system("pause"); return 0; }方案五:模板法
#include <stdio.h> #include <iostream> template <unsigned int n>struct Sum_Solutiion4 { enum Value{N = Sum_Solutiion4<N-1>::N + n}; }; template <> struct Sum_Solutiion4<1> { enum Value{N = 1}; }; int main() { printf("%d\n", Sum_Solutiion4<1000>::N); return 0; }
相关文章推荐
- JS中关于把函数作为另一函数的参数的几点小总结
- 《剑指offer》:[45]圆圈中最后剩下的数字(约瑟夫(Josephuse)环问题)
- 在调试javascript的时候,要常使用alert()
- 《剑指offer》:[44]扑克牌的顺子
- 《剑指offer》:[43]N个骰子的点数
- 提高JavaScript性能
- CSS权威指南-伪元素选择器
- JavaScript 与html的元素产生关联
- javascript标准对象
- jquery实现上传文件大小类型的验证例子(推荐)
- String、StringBuffer类
- css块级元素居中
- React Native技术周报一
- 自定义 jstl 标签
- React-nwb的使用
- jQuery实现对无序列表的排序功能(附demo源码下载)
- rapidjson的read和write的sample
- js面向对象
- ASP.NET MVC+Bootstrap个人博客之praise.js点赞特效插件
- jquery中的ready与load的区别