level 8
最大回文乘积
回文数就是从前往后读和从后往前读都一样的数。由两个$2$位数相乘得到的最大的回文数是 9009 = 91*99。
求由两个3位数相乘得到的最大的回文数。
2022年06月06日 03点06分
1
level 8
楼主是Mathematica新手,翻文档自学中。通过做欧拉计划的题目学习Mathematica用法。
本题我的代码是:
Select[Flatten[Transpose[{Range[100, 999]}] . {Range[100, 999]}],
IntegerDigits[
#] == Reverse[IntegerDigits[#
]] &] // Max
该代码是否有需要改进的地方?
2022年06月06日 03点06分
3
吧务
level 12
按你的思路(先构造出所有两个3位数乘积,再筛选其中的回文数)改的话大概可以这样:
SelectFirst[
Reverse@Sort@
Flatten[Transpose[{Range[100, 999]}] . {Range[100, 999]}], # ==
Reverse[#] &[IntegerDigits[#]] &] // RepeatedTiming
主要是两点
1. IntegerDigits没必要计算两次
2. 求最大的数没必要把所有的都Select出来,直接Sort以后SelectMax就可以了
类似的还有另一个思路:先构造出所有6位回文数,再筛选其中可以写成两个3位数乘积的。因为回文数的数量远小于两个3位数乘积的数量,所以这样可以更快一些。
SelectFirst[Tuples[Range[9, 0, -1], 3] . {100001, 10010, 1100},
Quantile[Divisors[#], 1/2] > #/1000 &] // RepeatedTiming
2022年06月07日 12点06分
12