对于一个给定的正整数 n ,请你找出一共有多少种方式使 n 表示为若干个连续正整数的和,要求至少包括两个正整数。

转自:https://blog.csdn.net/enjoying_science/article/details/50357303

设等差数列:
an=a+(n-1)*d (这里首项为a,公差d=1,第n项为an,前n项和为sn)
a1=a
an=a+n-1
sn=(a1+an)n/2=(2a-1+n)*n/2
再回到这个编程上来:
我们的输入数据其实就是sn,需要找到以a开始的n个连续的递增数列使得和为sn。
这里我们可以用循环来判定,给定一个n,sn已知,就可以求出a,如果a为正整数那么就可以找到等差数列的首项,加上n给定,d=1,那么就可以写出这个和式子。

进一步优化提高程序效率:这里的n无须一直从2开始枚举下去,可以由sn=(2a-1+n)*n/2,所以a=sn/n-n/2+1/2,该式子为递减函数,n越大,a越小,而a最小为1,故另a=1时可确定n的最大范围。

令a=1,得二元一次方程(1/2+n/2)*n=sn,即n^2+n-2*sn=0,可得方程两个根中取较大的根n=0.5*(-1+sqrt(1+8*sn)),从而确定n的最大枚举范围。

你可能感兴趣的:(算法总结)