题目来源:蓝桥杯2016初赛 C++ A组J题
题目描述
X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:16,24,36,54。其等比值为:3/2
现在,我们随机调查了一些获奖者的奖金数。请你据此推算可能的最大的等比值。
输入格式
输入存在多组测试数据
第一行为数字 N (0
输出格式
对于每组测试数据,输出一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数
输入样例
3
1250 200 32
4
3125 32 32 200
3
549755813888 524288 2
输出样例
25/4
5/2
4/1
问题分析
给解题程序代码,不解释。
AC的C++语言程序如下:
/* LQ0047 最大比例 */
#include
#include
#include
using namespace std;
typedef long long LL;
const int N = 100;
LL b[N], c[N], a[N];
LL gcd2(LL a, LL b)
{
if (a < b) swap(a, b);
if (b == 1) return a;
return gcd2(b, a / b);
}
int main()
{
int n;
while(cin >> n) {
for(int i = 0; i < n; i++)
cin >> a[i];
sort(a, a + n);
int cnt = 0;
for (int i = 1; i < n; i++)
if (a[i] != a[i - 1]) {
LL gcd = __gcd(a[i], a[i - 1]);
b[cnt] = a[i - 1] / gcd;
c[cnt++] = a[i] / gcd;
}
LL t1 = b[0], t2 = c[0];
for (int i = 1; i < cnt; i++) {
t1 = gcd2(t1, b[i]);
t2 = gcd2(t2, c[i]);
}
cout << t2 << "/" << t1 << endl;
}
return 0;
}