看见题目的第一反应是DP,可以使用之前的值来计算,递推公式如下:f(n) = f(n-i)+i
再增加适当的剪枝即可实现,但是对于64位的整数,肯定没有足够的存储空间,放弃。
考虑之后对公式进行了推导:
num = Σi(bg<=i<=end)=(bg+end)(end-bg+1)/2
上式中的bg和end分别为求和公式中起始的位置和结束的位置,均为闭区间。
令sub = end-bg+1,add = bg+end
则上述等式转换为num=sub*add/2,原命题也就转换为求解合适的区间问题。
得到了这个公式之后,再进行求解就会容易很多。
再考虑到sub不能大于add等信息,可以用来剪枝,最后的N^2复杂度的代码如下:
改程序在小数据的测试下正确,对于大数据没有测试。
因为算法本身还是存在缺陷,使用N^2的算法当N很大的时候是非常慢的,这个问题如何解决呢?
其实看过输出的结果之后就会有具体的思路了:
按照把整数分为n个数相加的情况,对n进行遍历,但是这里仍然需要对n的范围进行求和,这里可以使用求和公式求解,因此该算法是O(N)的。
新的算法如下:
新的算法在小数据下测试正确,如果有问题,欢迎提出讨论。