本题重点是 排序后找到一个每个数与第一个数的最大公约数
最开始写的是任意两个数的最大公约数,这样是不对的
自己写的
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int a[N];
int b[N];
int n;
int gcd(int a, int b) {
if (b) {
gcd(b, a % b);
}
else return a;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++) {
cin >> a[i];
}
sort(a, a + n);
//for (int i = 0; i < n; i++)
// cout << a[i] << ' ';
//cout << endl;
int cnt = 0;
for (int i = 1; i < n; i++) {
b[cnt++] = a[i] - a[0];
}
sort(b, b + cnt);
int d = 0x3f3f3f3f;
for (int i = 1; i < n; i++) {
d = min(gcd(b[i], b[0]), d);
}
if (!d) {
cout << n << endl;
}
else
{
int num = (a[n - 1] - a[0]) / d;
cout << num + 1 << endl;
}
return 0;
}
y总写的
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int n;
int a[N];
int gcd(int a, int b) {
if (b)
gcd(b, a % b);
else return a;
}
int main()
{
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
int d = 0;
sort(a, a + n);
for (int i = 1; i < n; i++) {
d = gcd(d, a[i] - a[0]);
}
if (!d)
cout << n << endl;
else cout << (a[n - 1] - a[0]) / d + 1 << endl;
return 0;
}