输入一个正整数,若该数能用几个连续正整数之和表示,则输出所有可能的正整数序列。
** 方法一:**
\#include "stdafx.h"\
void PrintOdd( int val, int n ){\
for( int i = 0; i \< n; i++ )\
cout \<\< val - n/2 + i \<\< " ";\
cout \<\< endl;\
}\
\
void PrintEven( int val, int n ){\
for( int i = -(n/2-1); i \<= n/2 ; i++ )\
cout \<\< val + i \<\< " ";\
cout \<\< endl;\
}\
// 对于奇数,必定存在 n%count = 0.\
// 对于偶数,必定存在 count/2\*(n/count\*2+1) = n.\
// 因为count偶数的时候,n/count的值恰为第count/2个.\
// 例如: 2 3 4 5 = 14. 14/4 = 3, 为4/2 = 2,第二个.\
// 所以4个数可表示为 3-1、3、3+1、3+2.\
void ConsInteger( int n ){\
for( int i = 2; i \< n/2; i++ )\
{\
int val = n/i;\
int halfI = i \>\> 1;\
// 奇数.\
if( i & 0x01 ){\
// 不能有负数.\
if( val - halfI \> 0 && n%i == 0 )\
PrintOdd( val, i );\
}\
else{ // 偶数.\
// 不能有负数.\
if( val - (halfI-1) \> 0 &&
halfI\*(val\*2 + 1) == n )\
PrintEven( val, i );\
}\
}\
}\
int main(){\
int n;\
cin \>\> n;\
ConsInteger( n );\
}\
/\*\
100\
18 19 20 21 22\
9 10 11 12 13 14 15 16\
请按任意键继续. . .\
\*/
** 方法二:**
\#include "stdafx.h"\
void ConsecutiveInteger( int n ){\
int iFront = 1, iBack = 2;\
int sum = iFront + iBack;\
while( iFront\*2 \< n )\
{\
while( sum \< n )\
sum += ++iBack;\
while( iFront \< iBack && sum \> n )\
sum -= iFront++;\
\
if( sum == n ){\
for( int i = iFront; i \<= iBack; i++ )\
cout \<\< i \<\< " ";\
cout \<\< endl;\
sum -= iFront++;\
}\
}\
}\
int main(){\
int n;\
cin \>\> n;\
ConsecutiveInteger( n );\
}