2021年蓝桥杯B组 C++填空第四题

369 阅读2分钟

这道题印象特别深,因此专门写一篇博客。 刚考完那会很多人都在讨论这道题,个人分析的原因是表面看起来简单,但是深究起来还是有点难度的。

题目讲解

讲的是一个数字能够被分解为三个数相乘 一共有多少种方案。 例如:4 能够被分解为 1×1×4 1×4×1 4×1×1 1×2×2 2×1×2 2×2×1 有六种方案 请说出 2021041820210418 可以被分解为多少种方案

初级理解

最简单的遍历

for i in range(1,2021041820210419):
    for j in range(1,2021041820210419):
        for k in range(1,2021041820210419):
            if i*j*k==2021041820210418:
                sum+=1

这是最简单的遍历 进行枚举的方式进行处理 但是这可是16位数的数字 16位数的三次方 那是多么庞大的数字,怕是跑几天都跑不出来,更何况是比赛的4个小时 因此很多人都是被这个障眼法给迷惑住了

题目重新分解

首先观察 4 它的相乘方案 只有三个因子 就是1 2 4

我们不妨将这个数放大一下

观察100 100所有的相乘方案总和起来观察 就是1 2 4 5 10 20 25 50 100 进行组合相乘 可以看到 是以10为中心点 左右两边的数进行相乘 组成新的乘法方案

返回去观察4也是如此 那么我们可以利用这个原理 对2021041820210418这个数字进行分解

2021041820210418**(1/2)

image.png

以44955998作为中心点 进行因子的计算

for i in range(1,44955998):
    if(2021041820210418%i==0):
        li.append(i)

image.png

得出小于中心点的数字

for l in li:
    m=int(2021041820210418/l)
    lis.append(m)

image.png

得出大于中心点的数字

image.png

将因子整合

最后利用枚举进行方案的计算

for i in list:
    for j in list:
        for k in list:
            if(i*j*k==2021041820210418):
                sum+=1

image.png

总结

为什么会写这个 除了很多人讨论 更多的是自己在考场写错了 而且是快解出来了 写这篇博客还是为了提醒自己别在关键时刻犯病 不然只能事后诸葛亮了 记录于2021年4月18日