python蓝桥杯 等差数列(省赛)

问题描述

  数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 N 个整数。
  现在给出这 N 个整数,小明想知道包含这 N 个整数的最短的等差数列有几项?

输入格式

  输入的第一行包含一个整数 N。
  第二行包含 N 个整数 A₁, A₂, · · · , AN。(注意 A₁ ∼ AN 并不一定是按等差数列中的顺序给出)

输出格式

  输出一个整数表示答案。

样例输入

5
2 6 4 10 20

样例输出

10

解题方法比较容易想到:

①对原始数列进行排序 ②按顺序求出相邻两个数之间的公差 ③求出所有公差的最大公约数(即是等差数列的公差)④利用公差+首项+末项求出项数

n=int(input())
s=sorted(list(map(int,input().split())))
cha=[]
for i in range(1,len(s)):
    chaa=s[i]-s[i-1]
    cha.append(chaa)
cha=sorted(list(set(cha)))

min_=min(cha)
gcd=0  #所有差的最大公约数 即是等差数列的公差
ans=False
for i in range(min_,-1,-1): #从最小的公差往下倒序求最大公约数
    if(ans):
        break
    for j in range(len(cha)):
        if(cha[j]%i==0):
            pass
        else:
            break
        gcd=max(gcd,i)
        if(j==len(cha)-1):
            ans=True
          
# print(gcd)
num=(s[-1]-s[0])//gcd+1 #利用等差数列公差和首项末项求项数
print(num)

以上这是第一版的代码,拿了90分,看来一下是哪里有问题,是在输入是 1 1 1 即本身就是一个等差数列的时候有的问题,所以改一下代码:

n=int(input())
s=sorted(list(map(int,input().split())))
cha=[]
for i in range(1,len(s)):
    chaa=s[i]-s[i-1]
    cha.append(chaa)
cha=sorted(list(set(cha)))

if(cha==[0]):
    print(len(s))
else:
    min_=min(cha)
    gcd=0  #所有差的最大公约数 即是等差数列的公差
    ans=False
    for i in range(min_,-1,-1): #从最小的公差往下倒序求最大公约数
        if(ans):
            break
        for j in range(len(cha)):
            if(cha[j]%i==0):
                pass
            else:
                break
            gcd=max(gcd,i)
            if(j==len(cha)-1):
                ans=True
            
    # print(gcd)
    num=(s[-1]-s[0])//gcd+1 #利用等差数列公差和首项末项求项数
    print(num)

AC了。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值