题目如下:
AC代码如下:
#include<stdio.h>
#include<string.h>
int s[50];
int m[50];
int gcd(int a,int b)
{
return b>0 ? gcd(b,a%b):a;
}
int main()
{
int t;
scanf("%d", &t);
int n,i;
int min;
while (t--)
{
memset(s, 0, sizeof s);
memset(m, 0, sizeof m);
scanf("%d", &n);
for (i = 0; i < n; i++)
{
scanf("%d", &s[i]);
}
int ok = 0;
int same = s[0];
for (i = 1; i < n; i++)
{
if (s[i] != same)
{
ok = 1;
break;
}
}
if (ok == 0)
printf("-1\n");
else
{
min = s[0];
for (i = 1; i < n; i++)
{
if (min > s[i])
min = s[i];
}
int tmp;
int p = 0;
for (i = 0; i < n; i++)
{
if (s[i] != min)
{
tmp = s[i] - min;
m[p++] = tmp;
}
}
int N = sizeof(m) / sizeof(m[0]);
tmp = m[0];
for(i=1;i<N;i++)
{
tmp = gcd(tmp,m[i]);
}
printf("%d\n",tmp);
}
}
return 0;
}
代码核心:
s[i]-x1k = s[i+1]-x2k
>> s[i]-a[i+1] = k(x1-x2)
之后用gcd处理一下,找到最小公约数就可以了!
具体请结合代码理解。
ps:第一次我是直接从1e6暴力搞了,结果重测时text 13 wa了。
所以还是直接gcd吧!
ACM之路,进步之路!!!