连续正整数

题目描述:一个正整数有可能可以被表示为 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 }
View Code
原文地址:https://www.cnblogs.com/landy126/p/3339900.html