题目描述:
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>, 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
分析:
算出a[1]和a[2],a[2]和a[3]........a[n-1]和a[n]之间的每个比例,组成长度为n-1的数组
然后对长度为n-1的数组,重复上次操作,直至数组长度为1,该值即为最大的比例
代码如下:
#include<iostream>
using namespace std;
int n;
unsigned long long int aa[105];
void quicksort(unsigned long long int *a,int left,int right);
int findmid(unsigned long long int *a,int left,int right);
double one(int nn,double *t);
void judge(double end);
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
unsigned long long int temp;
cin>>temp;
int flag=1;
for(int j=1;j<i;j++)
if(temp==aa[j])
{
flag=0;
break;
}
if(flag)
aa[i]=temp;
else
{
i--;
n--;
}
}
quicksort(aa,1,n);
double b[105];
for(int i=1;i<=n;i++)
cout<<aa[i]<<" ";
cout<<endl;
for(int i=1;i<n;i++)
b[i]=(double)aa[i+1]/aa[i];
double finish=one(n-1,b);
cout<<finish<<endl;
judge(finish);
return 0;
}
void quicksort(unsigned long long int *a,int left,int right)
{
if(left>=right)
return;
//cout<<"left is "<<left<<" right is "<<right<<endl;
int mid=findmid(a,left,right);
quicksort(a,left,mid-1);
quicksort(a,mid+1,right);
return;
}
int findmid(unsigned long long int *a,int left,int right)
{
if(left>=right)
return 0;
int low=left;
int high=right;
//cout<<"low is "<<low<<" a["<<low<<"] is "<<a[low]<<endl;
unsigned long long int temp=a[low];
//cout<<"temp is "<<temp<<endl;
while(low<high)
{
//cout<<"low is "<<low<<" high is "<<high<<endl;
while(low<high&&a[high]>=temp) high--;
a[low]=a[high];
while(low<high&&a[low]<temp) low++;
a[high]=a[low];
}
a[low]=temp;
return low;
}
double one(int nn,double *t)
{
if(nn==1)
return t[1];
double s[nn];
for(int i=1;i<nn;i++)
s[i]=t[i+1]/t[i];
nn--;
double result=one(nn,s);
return result;
}
void judge(double end)
{
if(end==(int)end)
{
cout<<end<<"/1";
return;
}
int sum=0;
while(end!=(int)end)
{
end=end*10;
sum++;
}
int fenzi=end;
int fenmu=1;
while(sum--)
fenmu=fenmu*10;
//cout<<"original fenzi is "<<fenzi<<endl;
//cout<<"original fenmu is "<<fenmu<<endl;
while(fenzi%2==0&&fenmu%2==0)
{
fenzi=fenzi/2;
fenmu=fenmu/2;
}
while(fenzi%5==0&&fenmu%5==0)
{
fenzi=fenzi/5;
fenmu=fenmu/5;
}
cout<<fenzi<<"/"<<fenmu;
}