题目表述:
给出一个正整数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
题意:输出一段连续的非负整数,其和等于N并且是不唯一答案中长度最小的。
由连续的非负整数可知这一串数字是差为1的等差数列,其和为
,变换可得这段连续非负整数的首项为
。L从给定初值遍历到100便可找到这段连续非负整数的首项且满足长度最小。
#include<iostream>
using namespace std;
int main(void)
{
int n,l;
cin>>n>>l;
int start,end,flag = 0;
for(int i = l;i <=100;i++)
{
if((2*n-i*i+i)%(2*i) == 0)
{
start = (2*n-(i*i)+i)/(2*i);
flag = 1;
end = i;
break;
}
}
if(flag)
{
for(int i = 0;i < end-1;i++)
cout<<start+i<<" ";
cout<<start+end-1<<endl;
}
else cout<<"No"<<endl;
return 0;
}