# 通过欧拉计划学Rust编程（第684题）

“欧拉计划”的网址：https://projecteuler.net

S(20)很容易求出来：

```let mut ss = 0;
for n in 1..=20 {
let a = n % 9;
let b = n / 9;
let s = (a + 1) * 10_u32.pow(b) - 1;
println!("{}", s);
ss += s;
}
println!("S(20): {}", ss);
```

```let mut fib = [0_u64; 91];
fib[1] = 1;
for i in 2..=90 {
fib[i] = fib[i - 1] + fib[i - 2];
println!("fib({}): {}", i, fib[i]);
}
```

```fib(88): 1100087778366101931
fib(89): 1779979416004714189
fib(90): 2880067194370816120
```

```fn fs(n: u64) -> u64 {
let a = n % 9;
let b = n / 9;
let mut s = BigUint::from(a + 1);
for i in 0..b {
s = s * BigUint::from(10_u64);
}
s = s - BigUint::from(1_u64);
let result = s % BigUint::from(1_000_000_007_u64);
result.to_string().parse::<u64>().unwrap()
}
```

S(n) = 5 * 10 ^ m - 5 - 9 * m

```use std::time::SystemTime;

const PRIME: u64 = 1_000_000_007_u64;

#[macro_use]
extern crate lazy_static;
lazy_static! {
static ref ARRAY: Vec<u64> = {
println!("initializing ARRAY ...");
let mut arr = vec![1];
let mut x = 1;
for _i in 1..PRIME - 1 {
x = x * 10 % PRIME;
arr.push(x as u64);
}
arr
};
}

fn main() {
let start = SystemTime::now();
let mut result = 0;
let mut fib = vec![0_u64, 1];
for i in 2..=90 {
let n = fib[i - 1] + fib[i - 2];
fib.push(n);
let ss = fss(n);
result = (result + ss) % PRIME;
println!("n:{} S:{} result: {}", n, ss, result);
}
println!("{:?}", start.elapsed());
}

fn ten_power_mod(n: u64) -> u64 {
let m = n % (PRIME - 1);
ARRAY[m as usize]
}

fn fs(n: u64) -> u64 {
let a = n % 9;
let b = n / 9;
let s = (a + 1) * ten_power_mod(b) - 1;
s % PRIME
}

fn sum_group(m: u64) -> u64 {
let temp = (9 * m) % PRIME;
let s = 5 * ten_power_mod(m) + PRIME - temp - 5;
s % PRIME
}

fn fss(n: u64) -> u64 {
let m = n / 9;
let mut s = sum_group(m);
for i in 9 * m..=n {
s += fs(i);
}
s % PRIME
}```

• 刷完欧拉计划中的63道基础题，能学会Rust编程吗？

0 条评论

• ### 通过欧拉计划学Rust编程（第686题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程（第650题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程（第73题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程：第100题

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程（第345题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程（第71题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程（第69题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学Rust编程（第54题）

由于研究Libra等数字货币编程技术的需要，学习了一段时间的Rust编程，一不小心刷题上瘾。

• ### 通过欧拉计划学习Rust编程(第17~21题)

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，所以先补一下Rust的基础知识。学习了一段时间，发现Rust的学习曲线非常陡峭，不过仍有快...

• ### 通过欧拉计划学习Rust编程(第13~16题)

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，所以先补一下Rust的基础知识。学习了一段时间，发现Rust的学习曲线非常陡峭，不过仍有快...

• ### 通过欧拉计划学习Rust编程(第13~16题)

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，所以先补一下Rust的基础知识。学习了一段时间，发现Rust的学习曲线非常陡峭，不过仍有快...

• ### 用欧拉计划学Rust编程(第79题)

网上银行常用的一种密保手段是向用户询问密码中的随机三位字符。例如，如果密码是531278，询问第2、3、5位字符，正确的回复应当是317。

• ### 用欧拉计划学Rust编程(第67题)

如果知道一个节点的左、右节点的最大路径，可以很容易地计算出当前节点的最大路径，从底层开始，逐层计算每个节点到底部节点的最大路径上一层的最大路径，所以从每一层中最...

• ### 用欧拉计划学Rust编程(第63题)

当a=4, b=3时，4 ^ 3 = 64，只是2位数，当幂次增加时，它的位数永远不可能超过幂次，此时不需要再尝试更多的b，退出内层循环即可。

• ### 用欧拉计划学Rust编程(第26题)

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，所以先补一下Rust的基础知识。学习了一段时间，发现Rust的学习曲线非常陡峭，不过仍有快...

• ### 用欧拉计划学Rust编程(第92题)

将一个数的所有数字的平方相加得到一个新的数，不断重复直到新的数已经出现过为止，这构成了一条数字链。

• ### 通过欧拉计划学习Rust编程语言

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，看来想准确理解MOVE的机制，还需要对Rust有深刻的理解，所以开始了Rust的快速入门学...

• ### 用欧拉计划学Rust编程(第55~59题)

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，所以先补一下Rust的基础知识。学习了一段时间，发现Rust的学习曲线非常陡峭，不过仍有快...

• ### 用欧拉计划学Rust编程(第35~38题)

最近想学习Libra数字货币的MOVE语言，发现它是用Rust编写的，所以先补一下Rust的基础知识。学习了一段时间，发现Rust的学习曲线非常陡峭，不过仍有快...