美文网首页
一道算术题🧮背后的算法迭代

一道算术题🧮背后的算法迭代

作者: Pope怯懦懦地 | 来源:发表于2020-12-12 14:44 被阅读0次

前段时间看到一道题,觉得是无聊开会时绝佳的消遣项目:

一个 10 位数 ab,cdef,ghij,各位不同,且满足:

题干

有天开了半天会,结果还是没有手算出来。就想着用脚本跑跑呗。

第一版·傻大粗黑

10.times do |a|
    10.times do |b|
        10.times do |c|
            10.times do |d|
                10.times do |e|
                    10.times do |f|
                        10.times do |g|
                            10.times do |h|
                                10.times do |i|
                                    10.times do |j|
                                        next if a % 1 != 0
                                        next if "#{a}#{b}".to_i % 2 != 0
                                        next if "#{a}#{b}#{c}".to_i % 3 != 0
                                        next if "#{a}#{b}#{c}#{d}".to_i % 4 != 0
                                        next if "#{a}#{b}#{c}#{d}#{e}".to_i % 5 != 0
                                        next if "#{a}#{b}#{c}#{d}#{e}#{f}".to_i % 6 != 0
                                        next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}".to_i % 7 != 0
                                        next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}".to_i % 8 != 0
                                        next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}#{i}".to_i % 9 != 0
                                        next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}#{i}#{j}".to_i % 10 != 0
                                        
                                        next if [a, b, c, d, e, f, g, h, i, j].uniq.size != 10
                                        
                                        puts "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}#{i}#{j}"
                                    end
                                end
                            end
                        end
                    end
                end
            end        
        end 
    end
end

跑了几分钟还没出结果。想着不对啊。算了一下:就算每秒算 100,0000 条,跑完 10^10 也得 2.7 个小时。等不起,等不起☹️。

第二版 ·剪枝✂️:

稍稍改进下吧。原本是预计会提高一倍,结果出奇地块😱:0.18 秒找到答案 3816547290

10.times do |a|
    next if a % 1 != 0
    10.times do |b|
        next if "#{a}#{b}".to_i % 2 != 0
        10.times do |c|
            next if "#{a}#{b}#{c}".to_i % 3 != 0
            10.times do |d|
                next if "#{a}#{b}#{c}#{d}".to_i % 4 != 0
                10.times do |e|
                    next if "#{a}#{b}#{c}#{d}#{e}".to_i % 5 != 0
                    10.times do |f|
                        next if "#{a}#{b}#{c}#{d}#{e}#{f}".to_i % 6 != 0
                        10.times do |g|
                            next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}".to_i % 7 != 0
                            10.times do |h|
                                next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}".to_i % 8 != 0
                                10.times do |i|
                                    next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}#{i}".to_i % 9 != 0
                                    10.times do |j|
                                        next if "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}#{i}#{j}".to_i % 10 != 0
                                        next if [a, b, c, d, e, f, g, h, i, j].uniq.size != 10
                                        
                                        puts "#{a}#{b}#{c}#{d}#{e}#{f}#{g}#{h}#{i}#{j}"
                                    end
                                end
                            end
                        end
                    end
                end
            end        
        end 
    end
end

第三版·用上排列:

想到如果一开始就用 0 ~ 9 的排列来排查,应该会省很多计算吧。

(0..9).to_a.permutation.each do |ary|
    found_it = true
    ary.each_with_index do |v, i|
        if ary[0 .. i].join.to_i % (i + 1) != 0
            found_it &= false
        end
    end
    puts ary.join if found_it
end

代码是省了不少,但反而慢了很多(101.8 秒),怪了🤔。加个 break 试试:

(0..9).to_a.permutation.each do |ary|
    found_it = true
    ary.each_with_index do |v, i|
        if ary[0 .. i].join.to_i % (i + 1) != 0
            found_it &= false
            break # 如果是 next 就没用。
        end
    end
    puts ary.join if found_it
end

快了一点 17.3 秒。

第四版·手工计算

当然,我们的终极梦想是能笔算出来😝。

(挖坑🕳️)


从这个例子可以看出,数学不过是在找出内在结构,罢了。

相关文章

  • 一道算术题🧮背后的算法迭代

    前段时间看到一道题,觉得是无聊开会时绝佳的消遣项目: 一个 10 位数 ab,cdef,ghij,各位不同,且满足...

  • 人生是一道算术题

    人生是一道算术题 ----宅家训娃即兴演讲录 孩子,人生其实就是一道算术题,你知道为什么吗?儿子一脸茫然的看着我摇...

  • Flink DataSet 迭代

    机器学习和图计算应用,都会使用到迭代计算,Flink 通过在迭代算子中定义 Step 函数来实现迭代算法,迭代算法...

  • 心与心沟通

    简单的牵手, 标注:情愿+情愿=❤️ 沟通一道简单算术题:1❤️+1❤️=1❤️

  • Boolan C++ 第九周 iterator_traits的

    当算法传入迭代器参数的时候,算法需要迭代器的一些类型数据,所以萃取器就代替迭代器对算法做出响应 实际的调用需要知道...

  • python编程(四级)3、递归与递推

    迭代法 迭代法解决问题的思路: 利用迭代算法解决问题,需要做好以下三个方面的工作: 确定迭代变量 在可以用迭代算法...

  • 一道算术题

    今天在读《把时间当做朋友》的时候,看到一个再平常不过的利息计算公式 利润 = 本金 *(1+利息)^ 时间 出于好...

  • 笑话

    小明考完试回家后: 妈妈:这次考得怎么样啊? 小明:唉,我有一道算术题算错了! 妈妈:什么算术题啊? 小明:题目问...

  • 笑话

    小明考完试回家后: 妈妈:这次考得怎么样啊? 小明:唉,我有一道算术题算错了! 妈妈:什么算术题啊? 小明:题目问...

  • 流迭代器

    算法是基于迭代器操作实现的。由于流迭代器支持迭代器操作,因此至少可在一些泛型算法上使用这类迭代器。 8 int m...

网友评论

      本文标题:一道算术题🧮背后的算法迭代

      本文链接:https://www.haomeiwen.com/subject/asmegktx.html