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

## 第55题 利克瑞尔数

349 + 943 = 1292

1292 + 2921 = 4213

4213 + 3124 = 7337

```extern crate num_bigint;
use num_bigint::BigUint;

fn main() {
let mut count = 0;
for n in 1..10000 {
if is_lychrel_number(n) {
println!("{}", n);
count += 1;
}
}
println!("count: {}", count);
}

fn is_lychrel_number(n: u64) -> bool {
let mut x = BigUint::from(n);
for _i in 0..50 {
x = lychrel_transform(&x);
if is_palindromic(&x) {
return false;
}
}
// 永远变不成回文数，只判断了50次
true
}

use std::str::FromStr;
// 前后颠倒，求和
fn lychrel_transform(n: &BigUint) -> BigUint {
let rev_str = n.to_string().chars().rev().collect::<String>();
let rev_n = BigUint::from_str(&rev_str).unwrap();
n + rev_n
}

fn is_palindromic(n: &BigUint) -> bool {
let str_n = n.to_string();
let rev_str = str_n.chars().rev().collect::<String>();
str_n == rev_str
}
```

## 第56题 幂的数字和

```extern crate num_bigint;
use num_bigint::BigUint;

fn main() {
let mut max_sum = 0;
for a in 1..100 {
for b in 1..100 {
let s = power(a, b).to_string();
let sum_digits = s.chars().map(|ch| ch.to_digit(10).unwrap()).sum::<u32>();
if sum_digits > max_sum {
max_sum = sum_digits;
println!(
"{} ^ {} len: {} sum of digits: {}",
a,
b,
s.len(),
sum_digits
);
}
}
}
println!("{}", max_sum);
}

fn power(a: u64, b: u64) -> BigUint {
let mut prod = BigUint::from(a as u64);
for _i in 0..b {
prod *= BigUint::from(a as u64);
}
prod
}
```

## 第57题 平方根逼近

```extern crate num_bigint;
use num_bigint::BigUint;

fn main() {
let mut count = 0;
let mut a = BigUint::from(3 as u64);
let mut b = BigUint::from(2 as u64);
for _i in 2..=1000 {
let c = &a + &b;
a = &c + &b;
b = c;
if a.to_string().len() > b.to_string().len() {
count += 1;
//println!("{} {}", a, b);
}
}
println!("{}", count);
}
```

## 第58题 螺旋素数

```use primes::PrimeSet;

fn main() {
let mut pset = PrimeSet::new();

let mut count_prime = 0;
for n in (3..).step_by(2) { // 边长
let lower_right = n * n;
let prime_four_corner = (0..4)
.map(|x| lower_right - (n - 1) * x)
.filter(|&x| pset.is_prime(x));
count_prime += prime_four_corner.count();

let percent = (count_prime as f32) / ((2 * n - 1) as f32);
if percent < 0.1 {
println!("{} count: {} percent: {}", n, count_prime, percent);
break;
}
}
}
```

## 第59题 异或解密

1）读文件，保存在数组中

cipher.txt文件中是ASCII码数值，转换成u8类型存储。

```let data = std::fs::read_to_string("cipher.txt").expect("文件无法打开");
let xs: Vec<&str> = data.split(",").collect();
let letters: Vec<u8> = xs.iter().map(|x| x.parse::<u8>().unwrap()).collect();
```

2）统计

3个小写字母密钥针对不同的位置进行XOR操作，index取0，1，2，表示位置索引。

```fn guess_pass(letters: &Vec<u8>, index: usize) -> char {
let mut key = '*';
let mut max_count = 0;
for pass in ('a' as u8)..=('z' as u8) {
let mut count = 0;
for (i, ch) in letters.iter().enumerate() {
if i % 3 == index {
let a = (ch ^ pass) as char;
if ('A'..='Z').contains(&a) || ('a'..='z').contains(&a) {
count += 1;
}
}
}
if count > max_count {
max_count = count;
key = pass as char;
}
}
key
}
```

3）猜三个位置上的密码

```let key = [
guess_pass(&letters, 0),
guess_pass(&letters, 1),
guess_pass(&letters, 2),
];
println!("key: {:?}", key);
```

4）解码，求和

```let mut sum: u32 = 0;
for (i, ch) in letters.iter().enumerate() {
let a = ch ^ (key[i % 3] as u8);
sum += a as u32;
print!("{}", a as char);
}
println!("\n");
println!("{}", sum);
```

```1539870_KBNiIXymh4SnmDEDZmUTg7tu1MTBVlLj
```

```https://github.com/slofslb/rust-project-euler
```

0 条评论

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

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

• ### 用欧拉计划学习Rust编程(第40~45题)

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

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

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

• ### 1份sql注入学习资料，据说从入门到精通

------------------------------------------------------------------------

• ### REALM: Retrieval-Augmented Language Model Pre Training

去年可以说是语言模型快速发展的一年，BERT、XLNET、Albert等等模型不断刷新各个NLP榜单。在NLP榜单中比较引人注目的应该属于阅读理解型的任务，例如...

• ### 【ICML 2020】REALM: Retrieval-Augmented Language Model PreTraining

去年可以说是语言模型快速发展的一年，BERT、XLNET、Albert等等模型不断刷新各个NLP榜单。在NLP榜单中比较引人注目的应该属于阅读理解型的任务，例如...

• ### VBA实用小程序54： 计算字符串中指定子字符串出现的次数

下面的自定义函数iCountString可以用来统计子字符串在字符串中出现的次数：

• ### GitHub日收7000星，Windows计算器项目开源即爆红！

昨日，微软官宣在 MIT 许可证下开源了 Windows 10 操作系统自带的计算器应用，源代码已托管在 GitHub 上。该项目发布即蹿红，在 GitHub...