程帅霞

不断受挫,不停起身,不断追寻,不止AC~~

导航

最大比例


最大比例

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

程序应该输出:
4/1

资源约定:
峰值内存消耗 < 256M
CPU消耗 < 3000ms

请严格按要求输出,不要画蛇添足地打印类似:“请您输入...” 的多余内容。

所有代码放在同一个源文件中,调试通过后,拷贝提交该源码。

注意: main函数需要返回0
注意: 只使用ANSI C/ANSI C++ 标准,不要调用依赖于编译环境或操作系统的特殊函数。
注意: 所有依赖的函数必须明确地在源文件中 #include <xxx>, 不能通过工程设置而省略常用头文件。

提交时,注意选择所期望的编译器类型。

 

 1 #include<cstdio>
 2 #include<cstdlib>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<iostream>
 6 #include<algorithm>
 7 #include<string>
 8 #include<vector>
 9 #include<queue>
10 #include<map>  
11 #include<set>
12 using namespace std;
13  
14 long long gcd(long long a,long long b)//求最大公约数,怕数值越出,所以用long long
15 {
16     long long t;
17     while(t=a%b)
18     {
19         a=b;
20         b=t;
21     }
22     return b;
23 }
24 int main()
25 {
26     long long a[100]={0},p1[100]={0},p2[100]={0},t,g,t1,t2;
27     int n,i,j,k;
28     scanf("%d",&n);
29     for(i=0;i<n;i++)
30         scanf("%lld",&a[i]);//处理输入
31     sort(a,a+n); //排序
32     j=1;
33     for(i=1;i<n;i++) //去重 
34     {
35         if(a[i]!=a[i-1])
36             a[j++]=a[i];
37     }//这里也可以考虑用set集合去重
38     n=j;
39     if(n==1) //只有一个数 
40         printf("1/1\n");
41     else if(n==2) //有两个数 
42     {    
43         g=gcd(a[n-1],a[n-2]);
44         printf("%lld/%lld\n",a[n-1]/g,a[n-2]/g);
45     }
46     else if(n>2)
47     {
48         k=0;
49         for(i=1;i<n;i++) //分别求出后一项和前一项的比值 
50         {
51             g=gcd(a[i],a[i-1]);
52             p1[k]=a[i]/g;
53             p2[k]=a[i-1]/g;
54             k++;
55         }
56         for(i=0;i<k;i++) //找出最小公比 
57         {
58             for(j=i+1;j<k;j++)
59             {
60                 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]
61                 {
62                     t1=p1[i]/p1[j];
63                     t2=p2[i]/p2[j];
64                 }
65                 else if(p1[i]*p2[j]<p1[j]*p2[i])
66                 {
67                     t1=p1[j]/p1[i];
68                     t2=p2[j]/p2[i];
69                 }
70                 else if(p1[i]*p2[j]==p1[j]*p2[i])
71                 {
72                     t1=p1[i];
73                      t2=p2[i];
74                 }
75             }
76         }
77         g=gcd(t1,t2);
78         printf("%lld/%lld\n",t1/g,t2/g);
79     }
80     return 0;
81 }

 

posted on 2020-10-13 14:39  程帅霞  阅读(175)  评论(0编辑  收藏  举报