真题解析│蓝桥杯省赛真题之“分数”

梁老师
梁老师 北京小升初老师~

0 人点赞了该文章 · 63 浏览





2018年蓝桥杯软件类省赛(软件类)C/C++大学A组第1题“分数”,一道结果填空题。

* 本文内容由倪文迪(华东理工大学计算机系软件192班)和罗勇军老师提供。

01

题目描述

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

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

02

题解

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

1+2+4+……+2n=2n+1−1 

03

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;
}

04

Java代码


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

05

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)))

图片


添加 家长论坛微信 



发布于 2024-04-26 13:48

免责声明:

本文由 梁老师 原创发布于 家长帮 ,著作权归作者所有。

登录一下,更多精彩内容等你发现,贡献精彩回答,参与评论互动

登录! 还没有账号?去注册

暂无评论

广告
All Rights Reserved Powered BY WeCenter V4.1.0 © 2025 京ICP备20005761号-2