问题描述:将一个正整数表示为两个或这个两个以上的连续自然数的和。给定一个数,输出所有的可能的结果。
例如:
3=1+2;
9=4+5;
9=2+3+4;
解决方法:
对于给定的整数n,求解基本思路如下,
1)用两个变量slow和fast分别表示连续自然数的最小数和最大数;
2)首先令slow=1,fast=2,他们是可能表示为n的初始集合。
3)while(slow < fast)
当slow到fast的和大于n时,令slow++,相当于从集合中删掉较小的元素;
当slow到fast的和小于n时,令fast++,相当于添加新元素到集合
当slow到fast的和等于n时,输出slow到fast之间(包括slow和fast)的整数,即要求的连续自然数;并且令slow++(求下一组)
C语言实现的的源码如下(VC编译器)
#include
#include
//将一个整数表示为连续自然数的和,例如:
//3=1+2
//9=4+5
//9=2+3+4
void pnt(int n, int low, int fast)
{
printf("%d=",n);
int i;
for(i = low; i < fast; ++i)
printf("%d+", i);
printf("%d", fast);
printf("\n");
}
//时间复杂度O(N)
//找到结果集返回1
//否则返回0
int gen(int n)
{
int ret = 0;//·µ»ØÖµ
int slow = 1;
int fast = 2;
int sum = 3;
while(slow < fast)
{
if(sum > n)
{
sum -= slow;
slow++;
}
else if(sum < n)
{
fast++;
sum += fast;
}
else
{
ret = 1;
pnt(n, slow, fast);
sum -= slow;
slow++;
}
}
return ret;
}
//testing
int main()
{
int i;
for(i = 1; i <= 20; ++i)
{
if(gen(i) == 0)
{
printf("%d=N/A\n", i);
}
printf("-----------------------------------\n");
}
system("pause");
return 0;
}
运行结果如下:
|