蓝桥杯练习题十一 - 乘积尾零(c++)

简介: 蓝桥杯练习题十一 - 乘积尾零(c++)

题目如下


如下的10行数据,每行有10个整数,请你求出它们的乘积的末尾有多少个零?

5650 4542 3554 473 946 4114 3871 9073 90 4329
2758 7949 6113 5659 5245 7432 3051 4434 6704 3594
9937 1173 6866 3397 4759 7557 3070 2287 1453 9899
1486 5722 3135 1170 4014 5510 5120 729 2880 9019
2049 698 4582 4346 4427 646 9742 7340 1230 7683
5693 7015 6887 7381 4172 4341 2909 2027 7355 5649
6701 6645 1671 5978 2704 9926 295 3125 3878 6785
2066 4247 4800 1578 6652 4616 1113 6205 3264 2915
3966 5291 2904 1285 2193 1428 2265 8730 9436 7074
689 5510 8243 6114 337 4096 8199 7313 3685 211

题目分析


这里,我们有两种思维方式来解题:


第一种,先乘积,再整除10,就可以知道有多少个尾零;


第二种,我们先思考什么情况下相乘会为0,抛开末尾本身就是0不说,那就是5分别和2,4,6,8相乘。这样,我们就可以来拆分数字,因为2,4,6,8都是2的倍数,所以我们只需要看看能拆分成多少个2和多少个5,举个例子:125 * 512 = 64000, 125 = image.png , 512 = image.png ,于是 2 的个数为 9,5 的个数为 3,共有 3 对 2 * 5,所以结果为 3。

第一种的解法

#include <iostream>
using namespace std;
int main()
{
    long long int a, sum = 1, aum = 0;
    for (int i = 0; i < 100; i++)
    {
        cin >> a;
        sum = sum * a;
        while ((sum % 10) == 0)
        {
            sum = sum / 10;
            aum++;
        }
        sum = sum % 10000;
    }
    printf("%lld", aum);
    return 0;
}

这里边乘边对10取余,这里只对sum = sum % 10000做个解释,前面写过一篇关于大数乘法的练习题,其理念是一样的,这里还有另一重含义,就是决定尾0的肯定不是前面几位,除非这个数后面本身就有很多0,但这种情况依然逃不过while的制裁,制裁后sum所剩无几,根本用不到10000取余,若是大于10000且没有尾0的数,先看看会不会超出作用域,这恐怕是必然,用后几位做运算绝对是可以满足条件的。有不同意见的同学欢迎评论区留言踢我一下,让我知道我错了。


第二种解法

#include <iostream>
using namespace std;
int main()
{
    int t_cnt, f_cnt, data = 0;
    t_cnt = f_cnt = 0;
    for (int i = 0; i < 100; i++)
    {
        cin >> data;
        while (data % 5 == 0)
        {
            f_cnt++;
            data /= 5;
        }
        while (data % 2 == 0)
        {
            t_cnt++;
            data /= 2;
        }
    }
    cout << min(t_cnt, f_cnt) << endl;
    return 0;
}

算出总共的2和5的数,取最小的那个,就是一共有多少对,这里就忽略了为0时的情况,因为是对2和5取余的,同学们不要有所怀疑,我只能说,这是个规律问题,或者说是个高等数学问题,莫要纠结。这个理念对了,那么题目肯定就做对了。比较懂数学的同学欢迎评论区给出详细的公式和解释。


总结


以上,与君共勉!  

目录
相关文章
|
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组蓝桥杯省赛真题