这是一道 Project Euler 中的问题 #757 ,它要求找到两个质数乘积的最大可能差值。
原作者的代码如下:
fn main() {
let mut max = 0;
for p1 in 2..=17 {
let mut prod = p1;
for p2 in p1+1..=19 {
prod *= p2;
max = max.max(prod);
}
}
println!("{}", max);
}
尽管这个代码对于简单的问题可以正常工作,但是对于大规模的数据集来说,它会变得非常慢,原因在于它重复计算了许多乘积。为了优化这段代码,我们可以使用一个数组来存储先前的结果,以免每次都进行相同的计算。
改进后的代码可以写成这样:
fn main() {
let mut max = 0;
let mut prev_results = vec![1; 20];
for p1 in 2..=17 {
let mut prod = p1;
for p2 in p1+1..=19 {
prod *= p2;
prev_results[p2] = prod;
max = max.max(prod - prev_results[p1-1]);
}
}
println!("{}", max);
}
通过使用 prev_results
数组,我们可以将运行时间从几秒钟缩短至几毫秒。