倪文迪陪你学蓝桥杯2021寒假每日一题:1.13日(2018省赛A组第1题)

2021年寒假每日一题,2017~2019年的省赛真题。
本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供。
后面的每日一题,每题发一个新博文,请大家每天博客蓝桥杯专栏: https://blog.csdn.net/weixin_43914593/category_10721247.html

每一题提供C++、Java、Python三种语言的代码。

文章目录

  • 1、题目描述
  • 2、题解
  • 3、C++代码
  • 4、Java代码
  • 5、Python代码

2018省赛A组第1题,题目链接:
分数 http://oj.ecustacm.cn/problem.php?id=1359

1、题目描述


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


2、题解

  倪文迪说:“这道题通分一下,再用等比数列求和,就能将原式化简。然后通过位运算或者幂次运算计算分子、分母,再除掉二者最大公约数,输出即可。”
  罗老师无话可说。
  算了,还是说一句:注意二进制的有一个基本特征, 1 + 2 + 4 + . . . + 2 n = 2 n + 1 − 1 1+2+4+...+2^n=2^{n+1}-1 1+2+4+...+2n=2n+11

3、C++代码

  代码中用gcd计算了最大公约数用于约分,使得分子分母互质。不过,其实不用约分,因为本身就是互质的。

#include
using namespace std;

int main(){
     
	int a = (1 << 20) - 1; //分子
	int b = (1 << 19);     //分母
	int t = __gcd(a, b);   //除去公约数
	cout << a/t << "/" << b/t;
	return 0;
}

4、Java代码

public class Main {
     
    public static void main(String[] args) {
     
        int a=(int) Math.pow(2, 20)-1;
        int b=(int) Math.pow(2, 19);
        System.out.println(a + "/" + b);
    }  
}

5、Python代码

  还是Python好,写一个C++、Java的功夫,可以写4个Python。

b = 0
a = 1
for i in range(0,20):
    b += a
    a *= 2
print('%d/%d'%(b,a/2))
print('%d/%d'%(2 ** 20 -1,2 ** 19))
print(str(2 ** 20 -1)+'/'+str(2 ** 19))
print('%d/%d'% (pow(2,20)-1 ,pow(2,19)))

你可能感兴趣的:(蓝桥杯每日一题)