蓝桥杯练习题十二 - 分数(c++)

简介: 蓝桥杯练习题十二 - 分数(c++)

题目如下


1/1 + 1/2 + 1/4 + 1/8 + 1/16 + … 每项是前一项的一半,如果一共有20项,求这个和是多少,结果用分数表示出来。

类似:3/2


当然,这只是加了前2项而已。分子分母要求互质。

下面哪一项是错误的?


题目中给出四个选项:


A.

int gcd(int a, int b)
{
    while (b > 0)
    {
        int c;
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}
int main()
{
    int a = 1048575;
    int b = 524288;
    int c = gcd(a, b);
    cout << a / c << "/" << b / c << endl;
    return 0;
}

B.

int gcd(int a, int b)
{
    return a % b ? gcd(b, a % b) : b;
}
int main()
{
    int a = 1048575, b = 524288;
    int t = gcd(a, b);
    cout << a / t << "/" << b / t << endl;
    return 0;
}

C.

long pow_2(int b)
{
    long x = 2;
    long res = 1;
    while (b > 0)
    {
        if (b & 1)
            res *= x;
        b >>= 1;
        x = x * x;
    }
    return res;
}
int gcd(long a, long b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
int main()
{
    cout << pow_2(20) - 1 << "/" << pow_2(19) << endl;
}

D.

long pow_2(int b)
{
    long x = 2;
    long res = 1;
    while (b > 0)
    {
        if (b & 1)
            res *= x;
        b >>= 1;
        x = x * x;
    }
    return res;
}
int gcd(long a, long b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}
int main()
{
    cout << pow_2(20) << "/" << pow_2(19) << endl;
}

题目解析


说实话,这道题真的挺难的,但难的却是思维,这道题又挺简单的,简单的是题目本身。


说了一通比较扯淡的话,博主也就只敢保证能解出来正确答案,要是找出一种错误的方法,这个难度就有点高了,从讨论区,博主也看到不少关于这道题的数学解法:等比数列公式。看到公式的时候,博主是有印象的,这题目大学时是学过的,还记得iOS中有一个数量的悖论:影响性能的永远不是黎平渲染的阴影圆角,而是数量。用到这里就是:你用不到的东西不代表没用。


题目留给大家,思路博主简单说下吧,这已经是第十二篇了,博主真不敢说对此类问题已经完全了解,说到底都是数学问题,有点心惊。


1.计算和


四个选项看的人有点懵,因为部分选项中没看到累加和的体现, 没错,你没看错,不用怀疑自己,确实没体现出累加和的运算,博主一开始也看的有些晕,这道题是昨天看的,晚上的时候又看了一遍才看明白,今天就现身说法。


这里的考点其实是最大公约数!!!


2.最大公约数


公式里体现的都是a,b两数作为分子分母的互斥的最小数,所以理所当然的要求出他们的最大公约数并分别除以这个最大公约数,有了这个理念,你再去看四个选项,问题就不大了。


求最大公约数,三段最好理解的代码:


片段1:

int gcd(int a, int b)
{
    return a % b ? gcd(b, a % b) : b;
}

片段2:

int gcd(int a, int b)
{
    while (b > 0)
    {
        int c;
        c = a % b;
        a = b;
        b = c;
    }
    return a;
}

片段3:

int gcd(long a, long b)
{
    if (b == 0)
        return a;
    return gcd(b, a % b);
}

总结


看完这道题目,感觉题目的意图不明显,并没有真正的去解题,可能是觉得题目本身不难,要考察的是求取最大公约数的方法,要说题目不难,剩下的,就留给大家去思考了吧,有问题,欢迎评论区留言讨论。

目录
相关文章
|
1月前
|
算法 C++
小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(五)2016年第七届C/C++ B组蓝桥杯省赛真题
|
1月前
|
网络安全
蓝桥杯-网络安全-练习题-crypto-rsa
蓝桥杯-网络安全-练习题-crypto-rsa
蓝桥杯-网络安全-练习题-crypto-rsa
|
1月前
|
算法 测试技术 C++
小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(八)2013年第四届C/C++ B组蓝桥杯省赛真题
|
1月前
|
算法 C++ 数据格式
小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(七)2014年第五届C/C++ B组蓝桥杯省赛真题
|
1月前
|
算法 C++
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(六)2015年第六届C/C++ B组蓝桥杯省赛真题
|
1月前
|
C语言
蓝桥杯练习题
蓝桥杯练习题包括6道C语言编程题:1. 判断三位数是否为水仙花数;2. 输出区间质因数分解;3. 将秒转换为&#39;H:M:S&#39;格式;4. 判断闰年;5. 删除可被整除元素并排序数组,数字转字母;6. 分类比较两个字符串关系。每题涉及不同逻辑操作,适合编程初学者练习。
26 3
|
1月前
|
人工智能 搜索推荐 C++
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
小唐开始刷蓝桥(一)2020年第十一届C/C++ B组第二场蓝桥杯省赛真题
|
1月前
|
机器学习/深度学习 存储 人工智能
小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(三)2018年第九届C/C++ B组蓝桥杯省赛真题
|
1月前
|
存储 人工智能 算法
小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(四)2017年第八届C/C++ B组蓝桥杯省赛真题
|
1月前
|
存储 人工智能 Java
小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题
小唐开始刷蓝桥(二)2019年第十届C/C++ B组蓝桥杯省赛真题