每日一练-等差数列


📆Date: 2023年2月10日
🎬Author: 小 y 同 学
📃Classify: 蓝桥杯每日一练
🔖Language: Python


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

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

  • 输出格式
      输出一个整数表示答案。

  • 样例输入

5
2 6 4 10 20
  • 样例输出
10
  • 样例说明
      包含 2、6、4、10、20 的最短的等差数列是 2、4、6、8、10、12、14、16、18、20。

  • 评测用例规模与约定
      对于所有评测用例,2 ≤ N ≤ 100000,0 ≤ Ai ≤ 109。


🌿解题思路
  • 题目梳理
      题目会给出一串数字,我们需要做的就是找出包含这些数字的等差数列,且这个等差数列的项数最小,注意我们要输出的是等差数列的项数,不是等差数列的元素或者其求和。
  • 核心处理
      首先给出的数字串是没有顺序的,我们首先肯定是想到将给出的数字排序。然后我们要做的就是寻找公差:起初小y想的是排序完的数组每相邻两项做差,然后最小的就是公差,但是仔细一想:如果排序完的数组中的相邻两项差一个是2,一个是3:例如数组:1、3、6;要想组成等差数列,必须以1为公差;随后就想到了取2和3的最大公因数也就是1来作为公差;同样的思路,就可以类比出给出的任意数列对应的公差。随后就是求项数,给出的数列最小的和最大的一定是等差数列的首尾项,我们可以由 a n = a 1 + ( n − 1 ) × d a_n=a_1+(n-1)\times d an=a1+(n1)×d推导出 n = a n − a 1 d + 1 n=\frac{a_n - a_1}{d}+1 n=dana1+1,但是我们要注意d为0的情况分开讨论!
🌸Python源码
# _*_coding:utf-8_*_
# created by cy on 2023/2/10
import math


# 求最大公因数
def gcd_many(li, n):
g = 0
for i in range(n):
  if i == 0:
      g = li[i]
  else:
      g = math.gcd(g, li[i])
return g


n = int(input())
A = list(map(int, input().split()))
A.sort()
d_li = []
for i in range(n - 1):
d_li.append(A[i + 1] - A[i])
if min(d_li) == 0:  # 公差为0的情况
print(n)
else:
d = gcd_many(A, n)
print(int((A[-1] - A[0]) / d + 1))

📧Summary

  小y的今日一练到此画上了句号,欢迎友友们多给建议🌼🌼🌼
  有兴趣一起学习编程的小伙伴可以私聊小y一起学习,小y在Python,c/c++和matlab语言上均有一定的基础😜😜😜


欢迎您的点赞👍+收藏🎁+关注❤ 😁😁😁
  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小 y 同 学

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值