题目描述:一个正整数有可能可以被表示为 n(n>=2) 个连续正整数之和,如: 15=1+2+3+4+5 15=4+5+6 15=7+8
请编写程序,根据输入的任何一个正整数,找出符合这种要求的所有连续正整数序列。
输入数据:一个正整数,以命令行参数的形式提供给程序。 输出数据:在标准输出上打印出符合题目描述的全部正整数序列,每行一个序列,每个序列都从该序列的最小正整数开始、以从小到大的顺序打印。
如果结果有多个序列,按各序列的最小正整数的大小从小到大打印各序列。此外,序列不允许重复,序列内的整数用一个空格分隔。如果没有符合要求的序列,输出 “NONE” 。
1 题目分析
(1)
从i开始到k的连续k-i+1个数的和为 (k-i+1)(k+i)/2 = N
(2)
(k-i+1)(k+i)/2 = N //假设该正整数为N
-> k(k+1) = 2N+i(i-1)
当i和N一定时就可得出k的值。
-> k = (-1+sqrt(1+4(2N+i2 -i)))/2
(3)
从1到N/2遍历(以>N/2为起始值的数列不可能满足题意),对于每个i根据得到的k是否是正整数可以判定该起始i是否可以找到一个满足题意的序列。
2 代码
1 #include <iostream> 2 3 using namespace std; 4 5 int main() 6 { 7 int N = 0; 8 cout<<"input N: "; 9 cin>>N; 10 bool NONE = true; 11 for(int i=1; i<=N/2; ++i) 12 { 13 float flag = 1+4*(2*N+i*i-i); 14 int temp = sqrt(flag); 15 if(temp*temp == (int)flag) 16 { 17 NONE = false; 18 int k = (-1+temp)/2; 19 for(int j=i; j<=k; ++j) 20 cout<<j<<" "; 21 cout<<endl; 22 } 23 } 24 if(NONE) 25 cout<<"NONE"<<endl; 26 system("pause"); 27 return 0; 28 }