序列和--全国模拟(一)

[编程题] 序列和
时间限制:1秒
空间限制:32768K
给出一个正整数N和长度L,找出一段长度大于等于L的连续非负整数,他们的和恰好为N。答案可能有多个,我我们需要找出长度最小的那个。
例如 N = 18 L = 2:
5 + 6 + 7 = 18 
3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
 
输入描述:
输入数据包括一行: 两个正整数N(1 ≤ N ≤ 1000000000),L(2 ≤ L ≤ 100)
 
 
输出描述:
从小到大输出这段连续非负整数,以空格分隔,行末无空格。如果没有这样的序列或者找出的序列长度大于100,则输出No
 
输入例子:
18 2
 
输出例子:
5 6 7
 
解题思路:等差数列求和。
该题可理解为“一段长度大于等于L的等差数列之和等于N”的过程。
S =n(a1+an) / 2
= n(a1+a1+(n-1)d) / 2 
= n(2a1+n-1) / 2 
= N
得:a1= (2N-n^2+n) / (2n)因此只需要判断求得的a1是否为正整数即可
 1 #include <iostream>
 2 using namespace std;
 3 int main()
 4 {
 5     int N,L;
 6     while(cin>>N>>L)
 7     {
 8         double a1;
 9         int flag = 0;
10  
11         for(int i = L;i<=100;i++)
12         {
13             if((2*N-i*i+i)%(2*i)==0 && (2*N-i*i+i)/(2*i)>= 0)
14             {
15                 int a1 = (2*N-i*i+i)/(2*i);
16                 flag = 1;
17                 int j=0;
18                 for(;j<i-1;j++)
19                 {
20                     cout<<a1+j<<" ";
21                 }
22                 cout<<a1+j<<endl;
23                 break;
24             }
25  
26         }
27  
28         if(flag == 0)
29         {
30             cout<<"No"<<endl;
31         }
32  
33     }
34     return 0;
35 }


 

原文地址:https://www.cnblogs.com/qqky/p/7064871.html