1.没有考虑到d=0的特殊情况。
2.只想到了求公差,没有想到怎么求最大公差使得数组数量最小,结合才学的求最大公约数。
/*
考虑特殊情况,d = 0
0 和 a 的最大公约数是 a
找每一项和第一项的差值,找所有差值的最大公约数为公差d
数量:(a[n - 1] - a[0]) / d + 1
要使得数量最少,公差d选最大
*/
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1e6 + 10;
int a[N], ds[N];
int n;
// 求最大公约数
int gcd(int a, int b)
{
return b > 0 ? gcd(b, a % b) : a;
}
int main(void)
{
cin >> n;
for(int i = 0; i < n; i++) cin >> a[i];
// 1.排序
sort(a, a + n);
// 2.找每一项和第一项的差值,找最大公约数
int d = 0;
for(int i = 1; i < n; i++) d = gcd(d, a[i] - a[0]);
// 3.数量:(a[n - 1] - a[0]) / d + 1
// 考虑 d = 0 的情况
if(d == 0) cout << n << endl;
else cout << (a[n - 1] - a[0]) / d + 1 << endl;
return 0;
}