1
0
This commit is contained in:
2026-02-04 11:15:03 +08:00
commit 8b20a5dd21
125 changed files with 4177 additions and 0 deletions

6
problems/p17/Cargo.toml Normal file
View File

@@ -0,0 +1,6 @@
[package]
name = "p17"
version = "0.1.0"
edition = "2024"
[dependencies]

104
problems/p17/src/main.rs Normal file
View File

@@ -0,0 +1,104 @@
fn number_to_letters(n: u32) -> String {
if n == 0 {
return "zero".to_string();
}
let ones = [
"", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine",
];
let teens = [
"ten",
"eleven",
"twelve",
"thirteen",
"fourteen",
"fifteen",
"sixteen",
"seventeen",
"eighteen",
"nineteen",
];
let tens = [
"", "", "twenty", "thirty", "forty", "fifty", "sixty", "seventy", "eighty", "ninety",
];
let mut result = String::new();
let mut num = n;
// 处理千位
if num >= 1000 {
let thousands = num / 1000;
result.push_str(&number_to_letters_under_1000(
thousands, &ones, &teens, &tens,
));
result.push_str("thousand");
num %= 1000;
if num > 0 {
result.push_str("and");
}
}
// 处理百位以下
if num > 0 {
result.push_str(&number_to_letters_under_1000(num, &ones, &teens, &tens));
}
result
}
fn number_to_letters_under_1000(n: u32, ones: &[&str], teens: &[&str], tens: &[&str]) -> String {
let mut result = String::new();
let mut num = n;
// 处理百位
if num >= 100 {
let hundreds = num / 100;
result.push_str(ones[hundreds as usize]);
result.push_str("hundred");
num %= 100;
if num > 0 {
result.push_str("and");
}
}
// 处理十位和个位
if num >= 20 {
let ten_digit = num / 10;
result.push_str(tens[ten_digit as usize]);
num %= 10;
if num > 0 {
result.push_str(ones[num as usize]);
}
} else if num >= 10 {
result.push_str(teens[(num - 10) as usize]);
} else if num > 0 {
result.push_str(ones[num as usize]);
}
result
}
fn count_letters(text: &str) -> usize {
text.chars().filter(|c| c.is_alphabetic()).count()
}
fn solve_letter_count(start: u32, end: u32) -> usize {
(start..=end)
.map(|n| count_letters(&number_to_letters(n)))
.sum()
}
fn main() {
// 验证 1-5 的例子
let test_words = ["one", "two", "three", "four", "five"];
let test_count: usize = test_words.iter().map(|w| w.len()).sum();
println!("1到5的字母数: {test_count}");
// 验证我们的函数
let our_count = solve_letter_count(1, 5);
println!("我们函数计算的1到5: {our_count}");
// 计算 1 到 1000
let result = solve_letter_count(1, 1000);
println!("1到1000的字母总数: {result}");
}