【问题描述】 数学老师给小明出了一道等差数列求和的题目。但是粗心的小明忘记了一 部分的数列,只记得其中 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。
先上代码:
nums = input()
target_nums = list(map(int,input().split(' ')))
target_nums = list(sorted(target_nums))
list1 = []
for i in range(int(nums)-1):
a = target_nums[i+1] - target_nums[i]
list1.append(a)
the_min = min(list1)
if the_min == 0:
print(nums)
else:
while True:
for i in range(1,int(nums)):
if (target_nums[i] - target_nums[0]) % the_min == 0:
pass
else:
break
else:
break
the_min = the_min - 1
c = target_nums[-1] - target_nums[0]
print(int(c/the_min) + 1)
这个题的题意并不难理解,我们首先搞定输入的问题。
1,先输入要输入数的个数,用一个input()接收到nums中。
2,下边接收数,可以看出数是由空格隔开的,用map函数把input割开后的数变为int类型储存在表格中。
下面便是非常有必要的一个行动,就是把杂乱无章的数变为有序数组这里用了sorted()函数(当然用.sort()方法也可以)
最关键的一步:找最大公差值
怎样找呢?我们不难看出,这一堆数的最大公差一定小于等于大数减小数差值的最大值而且大于等于1特殊情况就是公差为0其为常数列,所以思路就有了。
我们先找到最大公差值最大的情况,对于测试用例来说这个数是2,这个题比较巧最大公差值就是2,但是对于一般情况下,如果2不是最大公差值(对一些数不成立)就要逐步缩小这个最大公差值直到找到一个合适的公差值。
另外一个关键点:如何确定一个数是不是这些数可能的公差?
那我们就拿其中最小的数,对于排序后的数列来说就是第0号位置上的值,让非0号位上的值去减去这个值利用取余符号%判断结果是不是0就知道了