思路
题意是从等比数列中选出一些数,不一定是连续的数,推断数最大可能的公比是多少。
我们用其他数都除以第一个数就得到公比 p/q 的次幂,
$(\frac{p}{q})^r = (\frac{p}{q})^{k*s}$,最大的公比是 所有表示的次幂指数 的最大公因数得出的值
利用辗转相减法转化为除法可以求解。即求这些所有比值的最大公约数,分子和分母可以分开来分别来求。
辗转相减法
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long LL;
const int N = 110;
LL num[N], a[N], b[N]; // 分子和分母
LL gcd(LL a,LL b)
{
return b ? gcd(b,a%b) : a;
}
// 求最大公底数
LL gcd_sub(LL a,LL b)
{
if(a<b) swap(a,b);
if(b==1) return a;
return gcd_sub(b,a/b);
}
int main()
{
int n;
cin >> n;
for(int i = 1;i <= n;i++)
{
cin >> num[i];
}
sort(num+1,num+n+1);
int cnt = 0;
for(int i = 1;i <= n;i++)
{
if(num[i] != num[i-1])
{
// 约分
LL g = gcd(num[i],num[1]);
a[cnt] = num[i] / g; // 分子
b[cnt] = num[1] / g; // 分母
cnt++;
}
}
LL up = a[0], down = b[0];
for(int i = 1;i < cnt;i++)
{
// 求最大公底数
up = gcd_sub(up,a[i]);
down = gcd_sub(down,b[i]);
}
cout << up << "/" <<down << endl;
return 0;
}