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
最大公约数不会的小伙伴,可以看我前面的博客,里面有详细解释及代码

发布了137 篇原创文章 · 获赞 7 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/gl620321/article/details/105278947