题目
给出一个正整数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
java 程序
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int N = sc.nextInt();//接收正整数N
int L = sc.nextInt();//用于接收最少的连续长度L
boolean flag = false;//用于判断是否找到
int num = 0; //用于存储1+2+3+.....,目的是用于判断最小的连续是否大于正整数N
for(int i=0;i<=100;i++)
{
int length = L+i;
num += (i+1);
//序列长度大于100结束查找
if(length>100){
break;
}
//如果连续序列最小之和大于N,则跳出循环
if(N<num)
{
break;
}
//当序列长度为偶数时
if(length%2==0)
{
//满足先列要求时成立
if(N%length==(length/2)) {
int startNum = (N/length)-(length/2);
for(int j=1;j<=length;j++) {
if(j!=length)
System.out.print((startNum+j)+" ");
else
System.out.print(startNum+j);
}
//存在满足条件的连续序列
flag = true;
//输出一个之后跳出循环;
break;
}
}
//序列长度为奇数时
else {
//满足当下条件时,存在序列
if(N%length==0)
{
//计算起始数字
int startNum = (N/length)-(length/2);
for(int j = 0;j<length;j++)
{
if(j!=length-1) {
System.out.print((startNum+j)+" ");
}
else {
System.out.print(startNum+j);
}
}
//满足条件,找到序列
flag=true;
break;
}
}
}
//如果不成立时,输出No
if(!flag) {
System.out.println("No");
}
}
}