倪文迪陪你学蓝桥杯2021寒假每日一题:1.13日(2018省赛A组第1题)
2021年寒假每日一题,2017~2019年的省赛真题。
本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供。
后面的每日一题,每题发一个新博文,请大家每天看博客蓝桥杯专栏: https://blog.csdn.net/weixin_43914593/category_10721247.html
每一题提供C++、Java、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\)
3、C++代码
代码中用gcd计算了最大公约数用于约分,使得分子分母互质。不过,其实不用约分,因为本身就是互质的。
#include<bits/stdc++.h>
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)))