不使用 乘除、循环和判断 语句实现 1+…+n

46 – 不使用 乘除、循环和判断 语句实现 1+…+n

分类:剑指offer

构造函数

题目: 求 1 + 2 + … + n. 要求不能使用乘除法、for、while、if、else、switch、case 等关键字及条件判断语句(A?B:C)

要实现 1 + 2 + …+ n 不管是循环实现还是递归实现都必须有终止条件。

思路一

循环是让相同的代码执行 n 遍。 使用构造函数和静态成员变量实现。构造 n 个类,构造函数会执行 n 次,,用静态变量实现 i 递增, sum 求和。

;class Solution {public:// 注意,构造函数不能是静态的Solution() {++num;sum += num;};GetSum() {return sum;}static void Reset(){num = 0, sum = 0;};private:num;sum;};Solution::num = 0;unsigned int Solution::sum = 0;int main() {const int n = 10;Solution::Reset();Solution* sol = new Solution[n];cout << sol[n].GetSum() << endl;delete []sol;}思路二

基于递归实现,当 i == 0 时要终止递归,那么能否,当一个数字不等于 0 时调用递归函数,而它等于 0 时自动调用另一个终止函数呢? 使用派生类和基类间虚函数实现。 基类的指针可以指向派生类,虚函数表中存储的是对象所属类的虚函数。 !!n 将非0值转化为 1, 0 转化为 0

;class A;A *array[2]; // 不能用 A array[2] 因为 A 不完整,只能定义指针class A {public:Sum(unsigned int n) {return 0;}};class B: public A {public:Sum(unsigned int n) {return array[!!n]->Sum(n-1) + n; // !!n 将非0值转化为 1, 0 转化为 0 }};int main() {A a;B b;<< array[1]->Sum(10) << endl;}

参考《剑指offer》 p234

版权声明:本文为博主原创文章,未经博主允许不得转载。

上一篇47 – 按位实现加减乘除 四则运算

顶0踩0

你并不一定会从此拥有更美好的人生,

不使用 乘除、循环和判断 语句实现 1+…+n

相关文章:

你感兴趣的文章:

标签云: