問題描述:將一個正整數表示為兩個或這個兩個以上的連續自然數的和。給定一個數,輸出所有的可能的結果。
例如:
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;
}