題目表述:
給出一個正整數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;
}