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