博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
※剑指offer系列37:求1+2+3……+n
阅读量:4975 次
发布时间:2019-06-12

本文共 2314 字,大约阅读时间需要 7 分钟。

2019-07-23

11:44:01

从这个题开始,我有些题目标题前面会加一个※号,以表示此题目比较重要,要多复习其中的知识点。

这个题就1到n的加法,不能用乘数法、循环语句和条件语句。第一个方法就是把想要的计算放进构造函数,注意这里算累计和所以要一直更新值,因此一定要用静态成员函数。

1 class Solution { 2 public: 3     Solution() 4     { 5         n++; 6         sum += n; 7     } 8     static void reset() 9     {10         n = 0;11         sum = 0;12     }13     static unsigned int sumfind()14     {15         return sum;16     }17     unsigned int Sum_Solution(int n) {18         Solution::reset();19         Solution *a = new Solution[n];20         delete[]a;21         a = NULL;22         return Solution::sumfind();23     }24 private:25     static unsigned int n;26     static unsigned int sum;27 28 };29 unsigned int Solution::n = 0;//静态数据成员必须初始化30 unsigned int Solution::sum = 0;

第二种方法:用虚函数。其实用的思想还是递归,只不过以虚函数的形式呈现出来。

1 #include
2 using namespace std; 3 class Solution { 4 public: 5 virtual int Sum_Solution(int n) { 6 return 0; 7 } 8 }; 9 Solution *arr[2];10 class Solution2: public Solution11 {12 public:13 virtual int Sum_Solution(int n) {14 return arr[!!n]->Sum_Solution(n-1)+n;//f(n)=f(n-1)+n15 }16 };17 int main()18 {19 Solution a;20 Solution2 b;21 arr[0] = &a;22 arr[1] = &b;23 int val = arr[1]->Sum_Solution(5) ;24 cout << val<

第三种解法:使用函数指针的方法让指针选择相应的函数,还是递归的思路

1 #include
2 using namespace std; 3 typedef unsigned int (*fun)(unsigned int);//声明一个:返回值为指向unsigned int类型的指针类型,参数为unsigned int类型,的函数 4 unsigned int so1(unsigned int n)//相当于递归终止条件 5 { 6 return 0; 7 } 8 unsigned int so2(unsigned int n)//相当于递归循环函数 9 {10 static fun f[2] = { so1,so2 };//声明函数数组f,f的每一个元素是一个函数11 return f[!!n](n - 1) + n;12 }13 14 class Solution {15 public:16 unsigned int Sum_Solution(unsigned int n) {17 return so2(n);18 }19 };20 int main()21 {22 Solution so;23 cout << so.Sum_Solution(4) << endl;24 return 0;25 }

第四个:使用模板的方法

1 #include
2 using namespace std; 3 template
struct sum4 4 { 5 enum val{N= sum4
::N+n}; 6 }; 7 template<> struct sum4<1> 8 { 9 enum val { N =1 };10 };11 int main()12 {13 cout << sum4<100>::N << endl;14 return 0;15 }

这段代码没写注释因为模板我也不是很熟悉。这一个题虽然看起来不难,不过涉及到的这些知识点我确实以前掌握的不熟悉。

转载于:https://www.cnblogs.com/neverland0718/p/11230403.html

你可能感兴趣的文章
dhtmlx3.6 grid列头合并
查看>>
Java源码阅读HashMap
查看>>
PAT (Basic Level) Practise (中文)-1031. 查验身份证(15)
查看>>
hdu 2093 考试排名 (模拟)
查看>>
Zygote启动及其作用
查看>>
SQL语句 - 嵌套查询
查看>>
CodeForces 1110F Nearest Leaf | 线段树/换根
查看>>
spark 与 scikit-learn 机器学习流程组件设计哲学比较
查看>>
selenium下拉框踩坑埋坑
查看>>
Google guava cache源码解析1--构建缓存器(2)
查看>>
62DOM二级事件的兼容处理
查看>>
mac下导出JetBrains IDE Support插件给linux
查看>>
存储过程自动更新ID
查看>>
传奇衣服、翅膀、武器、怪物、NPC等外观代码计算方法与公式
查看>>
spring-cloud-feign 使用@RequetParam报错QueryMap parameter must be a Map: class java.lang.String
查看>>
命名冲突引发的现网故障
查看>>
Android学习笔记——log无法输出的解决方法和命令行查看log日志
查看>>
Binary Search PBP
查看>>
图片滚动显示,鼠标滑过放大显示
查看>>
ios使用ffmpeg错误收集
查看>>