给定一个整数N,如何判断他是否可以表示成k个连续的数之和?,可以按照如下公式进行判断:
(N - (1+k) / 2 * k) mod k (1)
如果上式得结果为0,那么整数N就可以分解为k个连续的数之和,否则,就不行。
同时,如果可以分解,那么这k个连续的数的第一个数是(1 + (N - (1+k) / 2 * k) / k)。
进一步,给定一个数,如何找该数可以表示的所有的的连续的数之和的序列哪?
同理,我们可以按公式(1)求得该数可以表示成最少连续数之和:min ,以及最多连续数之和:max
然后仍然按照公式(1)在min和max之间遍历,查看N是否可以表示成n个连续数的数之和(min<n<max)
这里给出公式(1)的C++代码(假设要分解的数为long类型)
完整的C++代码如下:
结果以及执行时间统计如下:
可以看到分解的时间如下:
3: 0.096866毫秒
4569: 0.249733毫秒
1234567890: 4.228037毫秒