UVA10407题解

· · 题解

前置知识

$2.$ **[排序](https://baike.baidu.com/item/%E6%8E%92%E5%BA%8F/1066239?fr=aladdin)** ## 思路 对于每一个数 $x$,我们都可以将其拆分成 $x=y \times d+r$ 的形式。设 $x_1\le x_2$,那么 $x_1-x_2$ 就等于 $(y_2 \times d+r)-(y_1 \times d+r)=(y_2-y_1) \times d$。那么显然,题目就是要我们找出这一列数的差分数组的最大公因数。 至于具体的实现,笔者觉得比较难的点在于读入和求最大公因数的过程中,接下来我们就把这些难点逐个击破。 ## 难点击破 $1.$ **读入** 这里的难点在于判断有没有读完,我们直接用 ```while``` 读入,当遇到 $0$ 时就退出。 $2.$ **最大公因数** 求两个数的最大公因数,可以用辗转相除法,$\gcd(a,b)=\gcd(a,b \bmod a)$,以下是辗转相除法的代码。 ```cpp int gcd(int a,int b) { if(a%b==0) return b; return gcd(a,a%b); } ``` 当然,你也可以使用 ```__gcd```,这是 C++ 自带的函数,它的作用是返回两个数的最大公因数。 ## 代码 ```cpp #include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<algorithm> #include<cmath> #include<set> #include<queue> #include<stack> #include<vector> #include<ctime> #include<map> #include<set> #include<bitset> #include<list> using namespace std; int n,a[1005]; int main() { while(1) { n=0; while(1) { cin>>a[++n]; if(a[n]==0) break; } if(a[1]==0) break; sort(a+1,a+n); int ans=a[2]-a[1]; for(int i=3;i<n;i++) ans=__gcd(ans,a[i]-a[i-1]); cout<<ans<<"\n"; } return 0; } ```