init
This commit is contained in:
6
problems/p17/Cargo.toml
Normal file
6
problems/p17/Cargo.toml
Normal file
@@ -0,0 +1,6 @@
|
||||
[package]
|
||||
name = "p17"
|
||||
version = "0.1.0"
|
||||
edition = "2024"
|
||||
|
||||
[dependencies]
|
||||
104
problems/p17/src/main.rs
Normal file
104
problems/p17/src/main.rs
Normal 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}");
|
||||
}
|
||||
Reference in New Issue
Block a user