[问题]
我们知道:1+2=3;
4+5=9;
2+3+4=9;
等式左边都是两个以上连续的自然数相加,那么是不是所有的整数都可以写成这种形式呢?
写一个程序,对于一个32位正整数,输出它所有的连续自然数之和的算式。
在网上搜了下,找到了下面的解法,问题被转换到”连续整数的固定和”,实现代码如下:
#include <stdio.h>
#include <stdlib.h>
int main(int argc,char** arg)
{
int left,right; //连续区间的左右边界
int sum; //当前的连续区间的数之和
int given; //需要分解的数
given = atol(argv[1]);
sum=0;
left=right=1;
while(left < given/2 + 1)
{
sum += right; //扩展右边界,求 [1, right] 的和
while(sum > given) //如果sum(1,right) > given
{
sum -= left;
left++; //收缩左边界,减少sum
}
if(sum == given) //区间满足条件
printf( “/n%d – %d “,left,right);
right++; //扩展右边界,进行一下个区间的探测
} //end_of_while
}
时间复杂度为O(n/2)