最大比例
題目
X星球的某個大獎賽設了 M 級獎勵。
每個級別的獎金是一個正整數。
並且,相鄰的兩個級別間的比例是個固定值。
也就是說:所有級別的獎金數構成了一個等比數列。
比如:16,24,36,54,其等比值爲:3/2。
現在,我們隨機調查了一些獲獎者的獎金數。
請你據此推算可能的最大的等比值。
輸入格式
第一行爲數字 N ,表示接下的一行包含 N 個正整數。
第二行 N 個正整數 Xi,用空格分開,每個整數表示調查到的某人的獎金數額。
輸出格式
一個形如 A/B 的分數,要求 A、B 互質,表示可能的最大比例係數。
數據範圍
數據保證一定有解。
輸入樣例
3
1250 200 32
輸出樣例
25/4
題解
思路
- 首先進行排序
- 其次選取相鄰兩數之商的最大公因數作爲公比
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 105;
long long a[N], b[N], x[N], cnt, n;
long long gcd(long long a, long long b) {
return b ? gcd(b, a % b) : a;
}
long long gcd_sub(long long a, long long b) {
if (a < b) swap(a, b);
if (b == 1) return a;
return gcd_sub(b, a / b);
}
int main () {
cin >> n;
for (int i = 0; i < n; i ++) cin >> x[i];
sort(x, x + n);
for (int i = 1; i < n; i ++)
if (x[i] != x[i-1]) {
long long t = gcd(x[0], x[i]);
a[cnt] = x[i] / t;
b[cnt] = x[0] / t;
cnt ++;
}
long long up = a[0], down = b[0];
for (int i = 0; i < cnt; i ++) {
up = gcd_sub(up, a[i]);
down = gcd_sub(down, b[i]);
}
cout << up << "/" << down;
return 0;
}