2018蓝桥杯A组:分数(3种方法 循环累称 快速幂运算 移位运算)

本文通过解决一个分数序列求和问题,探讨了如何使用快速幂运算提高计算效率,避免了传统循环方法的指数级时间复杂度,同时介绍了移位运算在特定情况下的应用。

一、题目:分数
1/1 + 1/2 + 1/4 + 1/8 + 1/16 + …
每项是前一项的一半,如果一共有20项,
求这个和是多少,结果用分数表示出来。
类似:
3/2
当然,这只是加了前2项而已。分子分母要求互质。

注意:
需要提交的是已经约分过的分数,中间任何位置不能含有空格。
请不要填写任何多余的文字或符号。


  • 分析思路:
    在这里插入图片描述在这里插入图片描述在这里插入图片描述

对分数求和之后需要约分,就是求它的最大公约数,而这道题目会发现分子和分母是互质的,不需要约分

  • 方法一: 循环累称求x,之后x(*2-1)/x

x=2^19(2* 2* 2* 2 *…)
其运行时间会很长

  • 方法二: 快速幂运算
    当我们计算2^100次方的时候,就算用long long类型,会发现结果是0,原因是发生了溢出,结果非常庞大,这就是指数爆炸问题,2的10次方是1024,而它的11次方变成了2048,指数每增加一次,结果却发生很大的变化。
    改进方法:采用快速幂运算,何为快速幂运算呢?
    举例:求3^10 (3的10次方),可以转化为9^ 5(9的5次方),在这基础上还可以转化(81^ 2)*(9^1)
    最初3的10次方需要循环10次,而之后一步一步的转换底数,运算速度会越来越快,有兴趣的同学可以试一下。
    在这里插入图片描述
    2^10 =2^8 * 2^2
    在这里插入图片描述
    2^11 =2^8 * 2^2 *2
  • 代码:
#include<iostream>
using namespace std;

long pow_2(int b){
	long x=2;
	long res=1;
	while(b>0){ //用b来移位 
		if(b&1) //b和1做与运算,检测到 
		res*=x;  //x每次都要平方 
		b>>1;  //右移一位,每次都要往前移 
		x=x*x; 
	}
	return res;
}
//求最大公约数 
int gcd(long a,long b){
	return b==0?a:gcd(b,a%b);
}
int main(){
	//cout<<gcd(12,9)<<endl; 可以用12和9做测试
	cout<<gcd(pow_2(20)-1,pow_2(19))<<endl;
	cout<<pow_2(20)-1<<"/"<<pow_2(19)<<endl; 
}

此方法可用于多种幂运算,灵活运用,感兴趣的可以记住前面的一段模板

  • 方法三: 移位运算
    此方法只能限于2的幂运算,3的话二进制变化为11,向左移位的话会变成110,而不是它的平方,发生错误
  • 代码
#include<iostream>
using namespace std;

int main(){
	long a=(1<<19);
	long b=(a<<1)-1;
	cout<<b<<"/"<<a<<endl;
	return 0;
} 

1是分子和分母的最大公约数,也就是他们是互质的
在这里插入图片描述
答案 1048575/524288
最大公约数不会的小伙伴,可以看我前面的博客,里面有详细解释及代码

<think>嗯,用户问的是蓝桥杯C语言B拿省三的重点算法。首先,我得回想一下蓝桥杯的考试结构和难度。蓝桥杯省赛的话,省三应该属于中等偏下的奖项,可能不需要特别高深的算法,但基础的一定要扎实。 然后,用户用的是C语言,B可能题目难度适中。需要重点掌握的算法应该是那些常考且比较基础的。比如模拟题,这类题目不需要复杂算法,但需要细心,因为蓝桥杯经常出这种题。然后是枚举,暴力枚举在时间允许的情况下能解决很多问题,尤其是数据量不大的情况。 接下来是排序算法,像冒泡、选择、插入这些基础的可能需要手写,虽然C语言有qsort,但有时候题目可能需要自己实现。还有查找,比如二分查找,这在处理有序数据时很高效,可能常考。 递归和回溯也是重点,比如全排列、合问题,这类题目用递归比较直观,但要注意剪枝优化。动态规划的话,省三可能需要掌握基础题型,比如斐波那契、背包问题,这些经典问题容易考到。 数学相关的问题,比如质数判断、最大公约数、快速幂,这些都是常见的数学工具,几乎每年都会涉及到。还有前缀和,处理区间和的问题,或者差分数处理区间修改,这些技巧在优化时间复杂度上很有用。 贪心算法可能考一些简单的问题,比如找零钱、区间调度,不过贪心通常需要证明正确性,可能难度稍高,但基础题还是得掌握。还有简单的图论,比如DFS、BFS,用于遍历或最短路径问题,尤其是迷宫类题目。 字符串处理也是不可忽视的,比如回文、子串查找,或者进制转换,这些题目在C语言中处理起来可能比较繁琐,但属于基础操作。位运算偶尔也会出现,比如异或、移位操作,处理二进制相关的问题。 数据结构方面,像链表、栈、队列可能考基本操作,比如用栈处理括号匹配,或者队列模拟排队问题。此外,日期计算问题在蓝桥杯里也常见,比如闰年判断、星期几计算,这些需要熟练掌握。 接下来要分析用户可能的需求。用户的目标是省三,所以不需要太复杂的算法,比如高级的图论算法或者复杂的动态规划。重点应放在基础算法和常见题型上,确保能快速解决简单和中等题目,避免在难题上浪费时间。 可能用户还不太清楚如何高效备考,所以需要给出复习建议,比如分模块练习,做真题,注意时间管理,调试能力等。这些建议能帮助他们有针对性地准备,提高效率。 另外,要强调代码的正确性和稳定性,因为蓝桥杯是OI赛制,一次提交,所以代码要尽量考虑边界情况,避免低级错误。比如模拟题一定要测试各种情况,确保正确。 总结下来,回答的结构应该先分点列出重点算法,每个算法简单说明应用场景,然后给出备考建议,帮助用户系统复习。同时,语言要简洁明了,符合用户的需求,避免使用过于专业的术语,保持易懂。</think>好的,我将结合蓝桥杯C语言B的命题特点,为你梳理省三等奖需要重点掌握的算法及备考策略: --- ### **一、必考基础算法(按优先级排序)** 1. **模拟题** - 高频考点:日历问题、图形打印、数列操作 - 关键:仔细理解题意,注意边界条件(如闰年、数越界) 2. **暴力枚举** - 典型场景:排列合、日期遍历、简单搜索 - 优化技巧:剪枝(如提前终止无效循环3. **排序与查找** - 必会代码:冒泡/选择排序(手写实现)、二分查找 - 应用示例:$$a[10] = \{3,1,4,5,2\}$$ 找第k小元素 4. **递归与回溯** - 重点题型:全排列(如$$n=3$$时的所有排列)、合选择 - 代码框架: ```c void backtrack(int step) { if(满足条件) 保存结果; for(所有可能选择){ if(合法选择){ 标记状态; backtrack(step+1); 撤销标记; } } } ``` 5. **动态规划基础** - 必会模型:斐波那契数列、爬楼梯、01背包(二维数实现) - 关键方程示例: $$dp[i] = dp[i-1] + dp[i-2]$$ --- ### **二、高频数学工具** 1. **数论基础** - 质数判断(试除法)、最大公约数(欧几里得算法) - 快速幂算法:计算$$a^b \% p$$(时间复杂度$O(\log b)$) 2. **前缀和与差分** - 前缀和应用:求区间和(如$$sum[l..r] = pre[r] - pre[l-1]$$) - 差分技巧:批量增减数区间值 --- ### **三、易拿分题型** 1. **字符串处理** - 常见任务:回文判断(双指针法)、子串统计、进制转换(如16进制转10进制) 2. **日期计算** - 关键函数:判断闰年、计算星期几(基姆拉尔森公式) - 示例:已知2023-10-1是星期日,推算其他日期 3. **简单贪心** - 典型问题:区间调度(选择不重叠的最多区间)、部分背包问题 --- ### **四、备考策略** 1. **真题训练** - 优先刷2018-2023年省赛真题,重点练习填空题和编程前3题 2. **模块化突破** - 按算法分类集中训练(如用2天专攻动态规划基础题) 3. **代码模板整理** - 准备常用代码段:快速排序、DFS框架、日期计算函数等 4. **时间分配技巧** - 填空题:15分钟内/题(注意结果验证) - 编程题:前2题保正确,后3题拿部分分 --- ### **五、注意事项** 1. C语言特性:注意数大小必须用常量声明(如`int a[100000]`可能栈溢出,改用全局变量或动态分配) 2. 输入输出:熟练使用`scanf/printf`格式化,注意`%lld`处理长整型 3. 调试技巧:在代码中插入`printf`输出中间变量(正式提交前记得删除) 建议每天保持3小时有效练习,重点突破弱项算法。省三目标需要保证60-100分(按不同省份分数线浮动),合理分配时间更容易达成目标!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值