蓝桥杯专题之数学篇

题目列表:

2016年:最大比例

2017年:承压计算,包子凑数

2019年:等差数列

2020年:合并检测

2021年:直线

2022年模拟赛:约数

2022年第一次模拟赛:奇不动排列,人字排列

2022年第二次模拟赛:半递增序列

1.最大比例

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

分析:

1.我们先分析两个例子:

                                           32     200     1250

他们之间的比例是:               \frac{25}{4}         \frac{25}{4}                     他们之间的最大比例是\frac{25}{4}

                                        32     200     3125

他们之间的比例是:              \frac{25}{4}        \frac{125}{8}                    25和125同是5的次方,4和8同是2的次方

所以他们之间的最大比例是\frac{5}{2}

代码:

下面先介绍一个类欧几里得算法:

 当知道两个数 a,b。  a=p^i   b=p^j   那么我们怎么求这个p呢?

long long ggcd(long long a,long long  b){
    if(a==b){//如果出现例1的情况,两个相同的分子和分母,25,25就立即返回,而不会返回5
        return a;
    }
    else{
        return ggcd(min(b/a,a),max(b/a,a));
    }
}

(只过了75%,博主实在是找不到问题所在,如果你发现了,请在评论区告诉我哦^^) 

#include<iostream>
#include<algorithm>
using namespace std;
const int MAX_N = 110;
int N;
long long a[MAX_N],z[MAX_N],m[MAX_N];
long long gcd(long long a,long long b){
	return b? gcd(b,a%b) : a;
}
long long ggcd(long long a,long long b){
	if(a == b){
		return a;
	}
	return ggcd(min(b/a,a),max(b/a,a));
}
int main(){
	cin >> N;
	for(int i = 0;i < N;i++){
		cin >> a[i];
	}
	sort(a,a+N);
	int j = 0;
	for(int i = 0;i < N-1;i++){
		if(a[i]!=a[i+1]){
			long long k = gcd(a[i],a[i+1]);
			z[j] = a[i+1]/k;
			m[j++] = a[i]/k;
		}
	}
	long long zm = z[0],mm = m[0];
	for(int i = 1;i < j;i++){
		zm = ggcd(zm,z[i]);
		mm = ggcd(mm,m[i]);
	}
	cout << zm << "/" << mm;
	return 0;
}

2.承压计算

X星球的高科技实验室中整齐地堆放着某批珍贵金属原料。

每块金属原料的外形、尺寸完全一致,但重量不同。
金属材料被严格地堆放成金字塔形。


                             7 
                            5 8 
                           7 8 8

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值