问题描述
数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一部分的数列,只记得其中 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了。