题目描述:
给出一个正整数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
示例1
输入
复制
18 2
输出
复制
5 6 7
分析,这是一个等差数列,找出等差数列的第一个数就对了,n是从小到大找,找到的第一个就是最小的那个排列。
C++解法:
#include<iostream>
using namespace std;
int main(){
int i,n,N,L;
cin>>N>>L;
for(n=L;n<=100;n++){
if((2*N-n*n+n)%(2*n) == 0){
int start=(2*N-n*n+n)/(2*n);
for(i=0;i<n-1;i++)
cout<<start+i<<" ";
cout<<start+n-1;
return 0;
}
}
cout<<"No";
}
我为什么写成:
for(i=0;i<n-1;i++)
cout<<start+i<<" ";
cout<<start+n-1;
写成:
for(i=0;i<=n-1;i++)
cout<<start+i<<" ";
不行吗?
不行,这样最后一个数就带有“ ”的空格。在它的编译器里判断为异常,下面这样提示: