# 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

回文数就是从前往后和从后往前读都一样的数.

由两个 位数相乘得到的最大回文乘积是 .

找出由两个 位数相乘得到的最大回文乘积.

, 小于 100 万的题我们穷举就行了.

不过不要傻乎乎的写 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 秒解决.