《剑指offer》:[46]求1+2+3+...+n

题目:求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)。这样的话我们就可以实现循环和终止的条件了。
方案四:利用函数指针来求解。其实这个思路和方案三比较类似。只不过把可以选择调用的虚函数该为了两个函数,调用更加简单直接了而已。
方案五:利用模板类型来求解,完成类似于递归的计算。
方案一:公式法
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[n];
	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;  
}  


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值