题解 | #序列和#

序列和

https://www.nowcoder.com/practice/46eb436eb6564a62b9f972160e1699c9

题目描述
	

描述

给出一个正整数 N 和长度 L ,找出一段长度大于等于 L 的连续非负整数,他们的和恰好为 N 。答案可能有多个,我我们需要找出长度最小的那个。 例如 N = 18 L = 2: 5 + 6 + 7 = 18 3 + 4 + 5 + 6 = 18
都是满足要求的,但是我们输出更短的 5 6 7
数据范围: 1 \le n \le 10^{9} \1n109  , 2 \le L \le 100 \2L100 

输入描述:

输入数据包括一行: 两个正整数N(1 ≤ N ≤ 1000000000),L(2 ≤ L ≤ 100)

输出描述:

从小到大输出这段连续非负整数,以空格分隔,行末无空格。如果没有这样的序列或者找出的序列长度大于100,则输出No

示例1

输入:
18 2
复制
输出:
5 6 7
复制

示例2

输入:
30 13
复制
输出:
No
复制
说明:
无法由非负整数构成 


解题思路: 利用(首项+尾项)*N/2==以首项起始,前N个数字相加之和来解题 将式子变形 其中head表示首项,l表示共有多少项,n表示以head为首项共有l项的序列相加的和。
遍历100个数字相加的结果,找到和为n的起始数字head,找到后如果n小于等于100并且head大于等于0 则输出即可
let come = readline().split(' ')
let n = parseInt(come[0])
let l = parseInt(come[1])
let arr=[]

while(l<=100){
    
    let head = ((2*n)-(l*(l-1)))/(2*l)

    let headInt=Math.floor(head)
    if(head==headInt && head>=0){
            for(let i=head;i<head+l;i++){
                arr.push(i)    
                }
        print(arr.join(' '))
        break
        
    }    
    l+=1
}
if(l==101){
    print('No')
}





全部评论

相关推荐

11-08 13:58
门头沟学院 Java
程序员小白条:竟然是蓝桥杯人才doge,还要花钱申领的offer,这么好的公司哪里去找
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务