剑指offer46 求1+2+3...+n的和

xiaoxiao2021-02-27  229

问题描述

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

解决

利用构造函数求解 创建该类的n个对象,在该类里定义两个静态成员变量n和sum,静态成员变量为所有对象所共享,在构造函数里对其操作。这样创建几个对象就调用几次构造函数,并加了多少次。 class Temp { public: Temp() { n++; sum+=n; } void Reset() { n=0; sum=0; } int GetSum() { return sum; } private: static int n; static int sum; } int Sum_Solution(int n) { Temp::Reset(); Temp* a=new Temp[n]; delete [] a; a=NULL; return GetSum(); }

2.利用虚函数求解 一个类中函数用于返回,一个类继承该类实现一个递归相加的函数并对基类的sum进行重写。定义两个基类的指针,一个指向基类对象,一个指向子类的对象。

class A; A* Array[2]; class A { public: virtual int Sum(int n) { return 0; } }; class B: public A { public: virtual int Sum(int n) { return Array[!!n]->Sum(n-1)+n; } }; int Sum_Solution(int n) { A a; B b; Array[0]=&a; Array[1]=(A*)&b; return Array[1]->Sum(n); }

3.利用函数指针求解 利用上面的思路定义两个函数,一个是用来求和,一个作为结束条件

typedef int (*fun)(int) int part1(int n) {   return 0; } int part2(int n) { static fun[2]={part1,part2}; return n+fun[!!n](n-1); ]
转载请注明原文地址: https://www.6miu.com/read-10744.html

最新回复(0)