# P1: 3 的倍数和 5 的倍数
Multiples of 3 and 5
如果我们列出 10 以内所有 3 或 5 的倍数, 我们将得到 3, 5, 6 和 9, 这些数的和是 23.
求 1000 以内所有 3 或 5 的倍数的和.
分别把 3 和 5 的倍数的集合穷举出来, 然后就俩集合的并集就行了. 注意 1000 以内, 最大是 999.
Total@Union[Range[3, 999, 3] ~ Join ~ Range[5, 999, 5]]
# P2: 偶斐波那契数
Even Fibonacci numbers
斐波那契数列中的每一项都是前两项的和. 由 1 和 2 开始生成的斐波那契数列前 10 项为:
考虑该斐波那契数列中不超过四百万的项, 求其中为偶数的项之和.
练习 F1, 输入斐波那契, 记住一个常用写法 NestWhile[#+1&,1,Fibonacci[#]<4000000&]
很多时候有些函数比如自己写的函数是没有反函数没法 Reduce
的, 可以用这个写法穷举上界时的 x
值.
上界有了直接 Select
就行了.
max = NestWhile[# + 1&, 1, Fibonacci[#] < 4000000&];
Total@Select[Table[Fibonacci[i], {i, 1, max}], EvenQ]
# P3: 最大质因数
Largest prime factor
练习 F1
的使用, 查找分解, 然后发现 FactorInteger
, FactorInteger
返回一个二元数组列表, 前一个是因子后一个是次数, 所以用 First
提取因子, Max
找到最大因子.
Max[First /@ FactorInteger@600851475143]
# P4: 最大回文乘积
Largest palindrome product
回文数就是从前往后和从后往前读都一样的数.
由两个
找出由两个
不过不要傻乎乎的写 Table[i j, {i, 100, 999}, {j, 100, 999}]
, 这不多算了吗.
Table[Table[i j,{j,i,99}],{i,10,99}]
就行.
然后有一个语法糖可以等价写成 Table[i j,{i,10,99},{j,i,99}]
.
然后造一个函数 ReverseQ
判定是否是个回文数. 然后就是 Select
判定取值, 然后 Max
取得最大值.
data = Flatten@Table[i j, {i, 100, 999}, {j, i, 999}];
ReverseQ[x_Integer] := Reverse@# == #&@IntegerDigits@x;
Max@Select[data, ReverseQ]
# P5: 最小倍数
Smallest multiple
最小的能够被
也就是求最小公倍数咯, 练习 F1
的使用.
LCM@@Range@20
# P6: 平方的和与和的平方之差
Sum square difference
前十个自然数的平方的和是
前十个自然数的和的平方是
因此前十个自然数的平方的和与和的平方之差是
求前一百个自然数的平方的和与和的平方之差.
小于百万, 直接穷举.
哦不, 练习一下公式推导好了. 好歹挂着个数学软件的名头.
FullSimplify[Sum[i, {i, 1, n}]^2 - Sum[i^2, {i, 1, n}]]
然后手算都可以. 补一个穷举.
Total[Range@100]^2 - Total[Range[100]^2]
# P7: 第 10001 个素数
10001st prime
列出前
第
F1
用起来.
Prime[10001]
# P8: 连续数字最大乘积
Largest product in a series
给定了一个
这道题确实能优化, 但是问题规模不大优化就浪费时间了, 你的时间比机器值钱.
直接一位一位的连续读
input = 73167176531330624919225119674426574742355349194934969835203127745063262395783180169848018694
7885184385861560789112949495459501737958331952853208805511125406987471585238630507156932909632952274
4304355766896648950445244523161731856403098711121722383113622298934233803081353362766142828064444866
4523874930358907296290491560440772390713810515859307960866701724271218839987979087922749219016997208
8809377665727333001053367881220235421809751254540594752243525849077116705560136048395864467063244157
2215539753697817977846174064955149290862569321978468622482839722413756570560574902614079729686524145
3510047482166370484403199890008895243450658541227588666881164271714799244429282308634656748139191231
6282458617866458359124566529476545682848912883142607690042242190226710556263211111093705442175069416
5896040807198403850962455444362981230987879927244284909188845801561660979191338754992005240636899125
6071760605886116467109405077541002256983155200055935729725716362695618826704282524836008232575304207
52963450;
Max[Times@@@Partition[IntegerDigits[input], 13, 1]]
# P9: 特殊毕达哥拉斯三元组
Special Pythagorean triplet
毕达哥拉斯三元组是三个自然数
例如:
有且只有一个毕达哥拉斯三元组满足
我们要跑穷举吗? 跑什么跑, 不是说了只有一个解吗, 那就解方程啊.
\begin{cases} {a^2} + {b^2} = {c^2}\\ a + b + c = 1000 \\ 0 < a < b < 1000 \\ \{a,b,c\} \in N\\ \end{cases}
直接把方程输进 Mathematica.
eq = {
a^2 + b^2 == c^2,
a + b + c == 1000,
0 < a < b < 1000
};
a b c /. Solve[eq, {a, b, c}, Integers] // First
# P10: 素数的和
Summation of primes
所有小于
求所有小于两百万的素数的和.
当然可以用上面的 NestWhile
测试下 x 的上界, 不过多用用 F1
你会发现一个叫 PrimePi
的函数.
Sum[Prime[i], {i, 1, PrimePi[2000000]}]
连续计时, 5 分 23 秒解决.