首页 > 试题广场 >

序列和

[编程题]序列和
  • 热度指数:104036 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 32M,其他语言64M
  • 算法知识视频讲解
给出一个正整数 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
示例2

输入

30 13

输出

No

说明

无法由非负整数构成 
只有两种情况下会有符合条件的输出:
1)L为奇数,N被L整除;
2)L为偶数,那么中间2项和必为奇数。
x = input().split()
N = int(x[0])
L = int(x[1])
def solver(N,L):
    if L%2==1 and N%L==0: return [N//L+(_-L//2) for _ in range(L)]
    elif L%2==0 and (2*N/L)%2==1: return [N//L+(_-L//2+1) for _ in range(L)]
    elif L<100: return solver(N,L+1)
    else: return []
ans = solver(N,L)
if not ans:
    print('No')
res = [str(_) for _ in ans] 
print(' '.join(res))

发表于 2021-03-19 18:36:50 回复(0)

「Python详细解题思路」

一开始不要被题目描述吓到,仔细品一下“找出一段长度大于等于L连续非负整数,他们的恰好为N”, 你细细品,其实不就是找到一个从某个数字开始以1为差长度为L的等差数列的和嘛。
复习一下从a1开始以d为差长度为n的等差数列的和为:
所以我们只要能找到一个整数a1作为起始数值就好,整理一下得:

N为已知,只需要根据l来求得a那么在代码实现时,我们可以从L开始,依次遍历所有l的可能(从L100),并检查相应求得的数值是否为整数即可。
详细代码如下:
## Python 3.*
## Written by CheesePrawn on 25th May 2020
if __name__ == '__main__':
    N, L = map(int, input().split(' '))
    ## 设定标签值,如果在接下来的程序中没有找到所需结果,最终输出No
    not_find = True
    ## 根据题意 2<=L<=100, 界定循环次数
    for l in range(L, 101):
        ## 根据公式进行计算
        a_start = (2 * N - (l - 1) * l) / (2 * l)
        ## 如果所得结果为整数,即为我们所要找的起始值
        if int(a_start) == a_start:
            not_find = False
            a_start = int(a_start)
            ## 依次输出,并以空格隔开,注意题意要求,最后一位结尾不需要空格,所以单独输出
            for i in range(l - 1):
                print(a_start + i, end=' ')
            print(a_start + l - 1)
            ## 根据题意只需要找到最短的,l是从小到大,所以最先找到的即为所求,不用再进行循环了
            break
    ## 如果没有找到,输出No
    if not_find:
        print("No")
参考lencha的解题思路
编辑于 2020-05-25 18:10:16 回复(1)
n, l = [int(i) for i in input().split()]
re = ''
for i in range(l,101):
    if (2*n+i+i*i) % (2*i) == 0:
        a1 = (2*n+i-i*i) // (2*i)
        if a1 < 0:
            break
        r = [str(x) for x in range(a1,a1+i)]
        re = ' '.join(r)
        break
if re:
    print(re)
else:
    print('No')
发表于 2020-05-14 22:19:50 回复(0)
N,L=map(int,input().split())

if L>=N:
    print('No')
else:
    if (2*N)%L==0 and (2*N//L-L+1)%2==0:
        start=(2*N//L-L+1)//2
    else:
        for i in range(L+1,N):
            if (2*N)%i==0 and (2*N//i-i+1)%2==0:
                start=(2*N//i-i+1)//2
                L=i
                break
    if start>=0 and L<=100:
        for i in range(L):
            print(start+i, end=' ' if i!=L-1 else '')
    else:
        print('No')
发表于 2020-04-29 18:44:30 回复(0)
from math import floor

def shortest_series(N, L):
    l = L
    while l <= 100:
        n = (2*N - l**2 - l) / (2*l)
        if floor(n) == n:
            n = int(n)
            for i in range(l - 1):
                n += 1
                print(n, end=' ')
            print(n + 1)
            return
        l += 1
    print('No')
    
N, L = map(int, input().split())
shortest_series(N, L)

原理方面的解释已经有无数优秀答案,分享个人比较喜欢的风格嘻嘻
发表于 2020-04-22 21:17:46 回复(0)

这道题让我在最后一句print输出格式上花了10分钟。。。太坑爹了,思想很简单,这是我在牛客上的第二道题,加油!

L,N=list(map(int,input().split(" ")))
n = N
state = False
y = L
while state ==False:
    cnt =0
    for i in range(n):
        cnt+=i
    # print(cnt)
    x=(y-cnt)%n
    if x==0:
       state =True 
    if state ==True: 
        break
    n+=1
if state==False or n>100:
    print('No')
else:
    ls =[]
    k =(y-cnt)//n
    for i in range(n):
        ls.append(k)
        k+=1
    for i in range(len(ls)):
            print(ls[i], end=' ' if i != len(ls)-1 else '')
发表于 2020-04-05 00:48:56 回复(0)
'''
等差数列公式:an = a1 + (n-1)*d
求和公式:   S = n(a1 + an)/2 = n * a1 + n(n-1)*d/2
此问题中:S = N  n = L  d = 1
则首项 a1 = (N*2/L+1-L)/2 
'''

'''
核心函数-等差数列 返回数列的首项,如果求得的首项不是整数说明长度L不合适,返回-1,
若求得的首项是整数,说明此时长度L合适,返回首项的值
'''
from sys import stdin
def check(N, L):
    if N * 2 % L == 0: # 确保能整除,得到的首项是整数
        if (N * 2 / L + 1 - L) % 2 == 0: # 确保能整除,得到的首项是整数
            if (N * 2 / L + 1 - L) / 2 >= 0: # 确保首项大于0
                return (N * 2 / L + 1 - L) / 2 # 返回数列首项
    return -1 # 无合适的数列首项,也就是首项不为整数
if __name__ == "__main__":
    # rstrip()移除字符串头尾指定的字符(默认为空格或换行符)
    ip_list = stdin.readline().rstrip().split(" ")
    N = int(ip_list[0]) # 正整数N
    L = int(ip_list[1]) (3731)# 长度L
    while L <= 100:
        x = check(N,L) # 寻找首项
        if x != -1: # 如果返回的首项不是-1,说明找出了合适的首项
            break # 跳出while循环
        else:    # 返回-1,说明还没找到合适的首项,即此时的长度L不合适
            L += 1   # 长度k加1,判断下个长度有没有合适的首项
    if x == -1:
        print('No')
    else:
        # 现在找出了长度K,以及开头的数字x,接下来组装输出结果就可以了
        res = ''
        for i in range(L):
            res += str(int(x+i))
            if i < L-1:  # 这个if判断的目的是最后的一个数后面不能带空格了
                res += ' '
        print(res)

编辑于 2020-03-26 11:20:54 回复(0)
from sys import stdin
def check(N, L):
    if N*2 % L == 0:
        if (N*2/L+1-L)%2 == 0:
            return (N*2/L+1-L)/2
    return -1
if __name__ == "__main__":
    ip_list = stdin.readline().rstrip().split(" ")
    N = int(ip_list[0])
    L = int(ip_list[1])
    k = L
    while k <=100:
        x = check(N,k)
        if x != -1:
            break
        k += 1
    if x == -1:
        print('No')
    else:
        res = ''
        for i in range(k):
            res += str(int(x+i))
            if i < k-1:
                res +=' '
        print(res)

发表于 2020-03-25 15:07:26 回复(1)
python3 解题思路




a=[]
result=input().split(' ')
N=int(result[0])
L=int(result[1])
b=''
if 1<=N and N<=1000000000 or 2<=L and L<=100:
for i in range(L,101):
if len(a)==0 and len(a)<=L:
if i%2!=0:
if N%i==0:
a.extend(range(int((N/i))-int((i-1)/2),int((N/i))+int((i-1)/2)+1))
elif i%2==0 :
if N%i==0.5*i:
a.extend(range(int(N/i)-int(i/2)+1,int(N/i)+int(i/2)+1))
strings = [str(inte) for inte in a]
b=" ".join(strings)
if len(b)>0:

print(b)
else:
print('No')
else:
print("No")
编辑于 2020-03-21 01:52:21 回复(0)
N = int(input('输入总和:>>'))
L = int(input('输入参照长度>>:'))
num_list = []
SUM = 0 
for LEN in range(L+1, N): 
    for i in range(1, N):
        SUM = sum(list(range(i, i+LEN))) 
        if SUM == N: 
            for j in range(i, i+LEN):
                num_list.append(j) 
    break 
print(num_list)
发表于 2018-02-26 13:00:42 回复(0)
import math
str_in=input('')
alst=[int(n) for n in str_in.split()]
N=alst[0]
L=alst[1]
A=[]
B=[]
C=[]
i_end=int((math.sqrt(8*N)-1)/2)
for i in range(L,i_end+3):
    if i%2==0 and (N/i)-int(N/i)==0.5:
        for j in range(1,int(i/2)+1):
            A.append(int(N/i-0.5*(j*2-1)))
            A.append(int(N/i+0.5*(j*2-1)))
        break
    if i%2!=0 and (N/i)-int(N/i)==0:
        A.append(int(N/i))
        for j in range(1,int(i/2)+1):           
            A.append(int(N/i-1*j))
            A.append(int(N/i+1*j))       
        break
A.sort()
if len(A)==0 or len(A)>100:
    print('No')
else:
    for k in range(len(A)):
        A[k]=str(A[k])
    print(' '.join(list(A)))

发表于 2017-07-06 21:11:58 回复(0)

热门推荐

通过挑战的用户