第七届年蓝桥杯省赛C/C++ A组 最大比例
2017-04-04 15:56
155 查看
题目
X星球的某个大奖赛设了M级奖励。每个级别的奖金是一个正整数。并且,相邻的两个级别间的比例是个固定值。
也就是说:所有级别的奖金数构成了一个等比数列。比如:
16,24,36,54
其等比值为:3/2
现在,我们随机调查了一些获奖者的奖金数。
请你据此推算可能的最大的等比值。
输入格式:
第一行为数字N(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 , 不能通过工程设置而省略常用头文件。
提交时,注意选择所期望的编译器类型。
思路
思路都在注释里,按计算机的运行步骤从main开始你会看懂的。代码
#include<stdio.h> #include<stdlib.h> long long num[101],temp1; int yon=0,yonPrintf=0; int cmp(const void *a,const void *b)//基本快速排序,之前测试时用的,但是这题没有使用这个 { return *(long long *)a-*(long long *)b; } void f(int z,int m,int min,int max)//用于判断不同比例(z/m)是否为正确比例 { long long temp=num[0]; for(int i=1;;i++){ if(temp*z/m==num[min+1]||temp==num[min+1]){//如果当前的temp值乘以比例(z/m)等于下一个数字的值或者temp等于下一个数字的值则min加一判断下下个数字的值 min++; if(max==min){ yon++; yonPrintf=1; return ; } }else{ if(temp*z/m>num[min+1]){//如果当前的值乘以给出的比例大于数字的值则此比列不是我们想要的 yonPrintf=-1; return ; }else{ temp=temp*z/m;//如果没有大于继续乘以比例(z/m) //num[min+2]; //num[min+3]; } } } } int main() { int m,numerator,denominator,nu,de; scanf("%d",&m); //输入个数 for(int i=0;i<m;i++){ scanf("%lld",&num[i]); //输入数字储存在num数组中 } for(int i=0;i<m-1;i++){//冒泡排序,对输入的数组进行升序排列 for(int j=0;j<m-i-1;j++){ if(num[j]>num[j+1]){ temp1=num[j]; num[j]=num[j+1]; num[j+1]=temp1; } } } // qsort(num,m,sizeof(num[0]),cmp);//也可用这函数排序,但数字较大不行,上网查了一下还是不行,求大神指点 for(int k=1;;k++){//k代表分子 if(yon==1) break; for(int i=1;i<k;i++){//i代表分母 if(yon==1) break; if(k==i||(k%i==0&&i!=1)||(i%k==0&&k!=1)||k<i){//丢弃比例为小于等于1和不是互质的数 continue; }else{ f(k,i,0,m-1); if(yon==1){ numerator=k; denominator=i; } } } } for(;;){//此循环用于判断比例分数同时平方时是否可行,可行则输出同时平方的值 nu=numerator*numerator; de=denominator*denominator; f(nu,de,0,m-1); if(yonPrintf==-1){ break; }else{ numerator=nu; denominator=de; } } printf("%d/%d",numerator,denominator);//输出 return 0; }
我不是大神,如有不对之处请指点。
相关文章推荐
- 2016年蓝桥杯省赛C/C++ A组 最大比例 (辗转相减法)
- 第七届蓝桥杯省赛C/C++B组 最大比例
- 2016年蓝桥杯省赛C/C++ A组 最大比例
- 使用JS实现HTML限定图像最大尺寸并等比例显示
- 一个非常好用的图片等比例缩放到指定最大高宽的函数
- 蓝桥杯_最大比例
- 2016蓝桥杯省赛C语言A组第十题 最大比例
- 蓝桥杯最大比例java实现
- 解决图片太大溢出问题、CSS 限制图片最大宽度、图片按比例自动缩放
- 第七届蓝桥杯C++B组 最大比例
- css 如何设置 某div 里面的所有图片的最大宽度。当加入文章里图片时,图片自动按比例减小。
- 蓝桥杯 最大比例
- 最大比例
- 用一段直径为1的原木制作截面是矩形的横梁,问梁的宽度x和高度y是怎样的比例时,才能使梁的强度最大?
- JAVASCRIPT 等比例缩放图片 限定最大宽度和最大高度
- 最大比例
- HTML限定图像最大尺寸并保持原有比例
- 蓝桥杯_最大比例
- 2016年第七届蓝桥杯C/C++程序设计本科B组省赛 最大比例(编程大题)
- 2016年蓝桥杯A组 第十题 最大比例