纸笔的力量

来源:互联网 发布:手机破解软件社区 编辑:程序博客网 时间:2024/04/29 06:01

对Mathematica着迷了,虽然我知道这热情不会持续多久。还是喜欢在解决问题中学习,这次是Project Euler的第38问。

提问:一个数依次×1,×2,……把所得连接成一个9位数,如果这个9位数正好是1到9的一个组合,则称其为原数的pandigital数。

回答:

Project Euler Problem 38

这段代码自己都觉得有点对不住观众,于是到论坛去取经。果然又找到了one-liner。

 

不过最让人惊叹的还是占着沙发的老兄,这哥们自豪地写道“我已经用纸和笔解决了”。这是Project Euler界的最高荣誉了。

他这样分析道:

我们已经知道9的pandigital数是918273645了,我们要找的数应该大于等于它。

  • 既然pandigital数是由×1,×2,……连接而来,那么最大的pandigital数必定以9开头(因为它要大于等于918273645);
  • 它不可能是9开头的两位数9[0-9],这种数的pandigital数要么是8位,要么是11位;
  • 它不可能是9开头的三位数9[0-9][0-9],这种数的pandigital数要么是7位,要么是11位;
  • 它不可能大于100,000,这种数的pandigital数位数肯定多于9位;

所以,我们要寻找的数只能是9开头的四位数9[0-9][0-9][0-9]。

  • 它不含0,因为0乘任何数仍为0,而该数的pandigital数只含1到9;
  • 它的各位均不同,否则×1时就会产生相同的数;
  • 它必然不含1,因为×2的时候会产生1,谁让你9打头呢;
  • 它的次高位不会是5以上,因为×2的时候会出现9,与×1的时候的9重复(9[5-9][2-9][2-9]×2 = 19xxx);
  • 它的次高位不会是4,因为×2的时候会出现两个8或者一个9(94[2-9][2-9]×2 = 18[8-9]xx);

现在看来,可能是数只能是9[2-3][2-7][2-7]了。我们试试93[2-7][2-7]:

  • 它的第3位不会是7,因为×2的时候会出现7,与×1时重合(937[2-7]×2 = 187xx);
  • 它的第3位不会是6,因为×1的时候曾出现3,所以×2时不能有进位(936[2-4]×2 = 1872x,x必为偶数,其pandigital数缺5);
  • 它的第3位不会是5,因为×2的时候会出现两个1或者一个0(935[2-7]×2 = 187[0-1]x);
  • 它的第3位不会是4,因为×2的时候会出现两个8或者一个9(934[2-7]×2 = 186[8-9]x);
  • 它的第3位不会是3,因为出现了两个3(933[2-7]);

我们试试9327吧:

9327 × 1 = 9327
9327 × 2 = 18654

就是它了!

原创粉丝点击