最大比例
X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。
并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:
16,24,36,54
其等比值为:3/2
现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。
输入格式:
第一行为数字 N (0<N<100),表示接下的一行包含N个正整数
第二行N个正整数Xi(Xi<1 000 000 000 000),用空格分开。每个整数表示调查到的某人的奖金数额
要求输出:
一个形如A/B的分数,要求A、B互质。表示可能的最大比例系数
测试数据保证了输入格式正确,并且最大比例是存在的。
例如,输入:
3
1250 200 32
程序应该输出:
25/4
再例如,输入:
4
3125 32 32 200
程序应该输出:
5/2
再例如,输入:
3
549755813888 524288 2
扫描二维码关注公众号,回复:
11975277 查看本文章
程序应该输出:
4/1
资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms
解析:另补,,,
//第一种
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long LL;
const int N = 110;
int n;
LL a[N], b[N], x[N];
LL gcd(LL a, LL b)
{
return b ? gcd(b, a % b) : a;
}
LL gcd_sub(LL a,LL b)//辗转相减的另一种使用
{
if(a==b) return a; //这里一定会 出现这种情况的 因为我们的b和a是倍数关系
if(a>b) return gcd_sub(b,a/b);//我们保证a>b
else return gcd_sub(b,a);
}
int main()
{
cin >> n;
for (int i = 0; i < n; i ++ ) cin >> x[i];
sort(x, x + n);
int cnt = 0;
for (int i = 1; i < n; i ++ )
if (x[i] != x[i - 1])
{
LL d = gcd(x[i], x[i - 1]);
a[cnt] = x[i] / d;
b[cnt] = x[i - 1] / d;
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;
}
//第二种
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
long long gcd(long long a,long long b)//求最大公约数,怕数值越出,所以用long long
{
long long t;
while(t=a%b)
{
a=b;
b=t;
}
return b;
}
int main()
{
long long a[100]={
0},p1[100]={
0},p2[100]={
0},t,g,t1,t2;
int n,i,j,k;
scanf("%d",&n);
for(i=0;i<n;i++)
scanf("%lld",&a[i]);//处理输入
sort(a,a+n); //排序
j=1;
for(i=1;i<n;i++) //去重
{
if(a[i]!=a[i-1])
a[j++]=a[i];
}//这里也可以考虑用set集合去重
n=j;
if(n==1) //只有一个数
printf("1/1\n");
else if(n==2) //有两个数
{
g=gcd(a[n-1],a[n-2]);
printf("%lld/%lld\n",a[n-1]/g,a[n-2]/g);
}
else if(n>2)
{
k=0;
for(i=1;i<n;i++) //分别求出后一项和前一项的比值
{
g=gcd(a[i],a[i-1]);
p1[k]=a[i]/g;
p2[k]=a[i-1]/g;
k++;
//printf("%d %d %d\n", k - 1, p1[k - 1], p2[k - 1]);
}
for(i=0;i<k;i++) //找出最小公比
{
for(j=i+1;j<k;j++)
{
if(p1[i]*p2[j]>p1[j]*p2[i]) //p1[i]/p2[i]比p1[j]/p2[j]大 p1[i]/p2[i]除p1[j]/p2[j]
{
t1=p1[i]/p1[j];
t2=p2[i]/p2[j];
}
else if(p1[i]*p2[j]<p1[j]*p2[i])
{
t1=p1[j]/p1[i];
t2=p2[j]/p2[i];
}
else if(p1[i]*p2[j]==p1[j]*p2[i])
{
t1=p1[i];
t2=p2[i];
}
}
}
g=gcd(t1,t2);
printf("%lld/%lld\n",t1/g,t2/g);
}
return 0;
}