题解 | #序列和#
序列和
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} \1≤n≤109 , 2 \le L \le 100 \2≤L≤100输入描述:
输入数据包括一行: 两个正整数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') }